在类上加@Component或者其他注解时,该类会交给spring来管理,自动创建对象,但是如果是自己new出来的对象或者自己类没加注解,但是内部又需要注入其他对象以及需要注入配置文件中的属性时,有以下办法解决:
1、解决注入对象问题:
新建一个工具类,比如GetBeanUtil
public class GetBeanUtil implements ApplicationContextAware {
protected static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);//name表示其他要注入的注解name名
}
public static T getBean(T c){
return applicationContext.getBean(c);//T表示类
}
}
举例使用上述工具类:
public MyClass
{
@AutoWired
private OtherClass otherClass;
}
上面类在new MyClass时,OtherClass类注入会失败,此时改进一下情况即可:(注意,OtherClass必须是spring注解过的)
public MyClass
{
private OtherClass otherClass = GetBeanUtil.getBean(OtherClass.class);
}
简单解释一下工具类为什么能够找到类,是因为在启动spring后,spring会将所有注解过的类加载容器内,并返回 给ApplicationContextAware,在其他注解后的类需要对象时,容器会自动注入,但是自己new的类缺不会被容器注入,此时,自己实现ApplicationContextAware,自己根据类的类型手动获得加载后的bean即可。
2、解决注入属性问题
创建一个工具类:
@Component//注意此时要加注解
public class GetPropertiesUtil
{
private static String properties;
public static Stirng getProperties()
{
return properties;
}
@Value("${properties}")
public void setProperties(String properties)
{
this.properties = proterties;
}
}
注意两点:1、该工具类要加上注解,否则会像第一种情况;
2、内部属性加@Value的地方是set方法上,而且set方法不是statis;
使用举例:
public MyClass
{
@Value("${properties}")
private String properties;
}
上面类在new MyClass时,xxx属性注入会失败,此时改进一下情况即可:
public MyClass
{
private String properties = GetPropertiesUtil.getProperties();
}
————————————————
版权声明:本文为CSDN博主「enjoy_Day」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28080659/article/details/99687074