8
回答
spring新手问题,关于反射
华为云实践训练营,热门技术免费实践!>>>   

环境: org.springframework.boot + mybatis 

在 @Scheduled(cron="0/20 * *  * * ? ")的方法下, 起了4个线程 Runnable 

@Override
public void run() {
    try {
        System.out.println("开始加入队列");
        queueHandle.produce(this.taskQueueEntity);
        Class<?> c = Class.forName(taskQueueEntity.getServiceClass());
        Object task = c.newInstance();
        System.out.println(task.toString());
        System.out.println("加入成功");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

我自己用java的class.forName @Autowired是null.

无法使用 mybatis查询数据了...有大神知道怎么解吗?

<无标签>
举报
零点钟
发帖于1年前 8回/510阅
共有8个答案 最后回答: 1年前
1,把如下文件在xml中定义个bean.
package app.contextAware;

import javax.servlet.ServletContext;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.ServletContextAware;

public class ApplicationContextAware implements org.springframework.context.ApplicationContextAware {

	private static ApplicationContext applicationContext;
	
	@Override
	public void setApplicationContext(ApplicationContext arg0)
			throws BeansException {
		
		this.applicationContext = arg0;
		
	}
	
	public static <T> T getBean(String beanName){
        return (T) applicationContext.getBean(beanName);
    }

}


2,在使用Dao的地方。

ApplicationContextAware.getBean("xxxxDao")//可以通过

applicationContext.getBeanDefinitionNames()来获取你的dao是什么注入名字,然后粘进去,就可以在多线程中索取dao进行操作了。


如果你想获取到springd的ApplicationContext 实现这个接口 org.springframework.context.ApplicationContextAware 得到 ApplicationContext  getBean() 看能不能拿到你的bean
--- 共有 1 条评论 ---
零点钟好的..谢谢~~ 1年前 回复
这里你要理解spring框架和原理,spring所产生的bean,并不是我们平时new的对象。那些spring所创建的对象,你可以看做是实际对象的代理对象,它继承了你的class,并包裹着那实际对象,只有这样,spring的AOP才能玩起来,所以自己手动去的对象,并不在spring容器的管辖范围内,所以是找不到你的bean的。你要创建一个spring可控的bean,不能单纯new或者反射创建就完事,必须使用spring的bean注册方式,让spring帮你创建那个对象。你现在上面的创建方式,是不能通过spring去获取到的。
--- 共有 2 条评论 ---
Allen_Ho回复 @零点钟 : 简单了解一下spring原理,可以让你更正确地使用spring 1年前 回复
零点钟我重新看了 spring的框架, 大概了解了spring的bean容器 http://stackoverflow.com/questions/21827548/spring-get-current-applicationcontext 1年前 回复
你可以直接注入,为啥要反射一下new个出来?即使new出来了,也是不能用的
--- 共有 2 条评论 ---
尚浩宇回复 @零点钟 : 你可以试试,在调度类里直接注入service,然后使用 1年前 回复
零点钟可能是因为我对功能的实现过程想的比较繁琐了...对spring不太了解 1年前 回复
顶部