问题:使用@Autowired无法注入Bean对象
版权声明:From Lay
https://blog.csdn.net/Sadlay/article/details/82952163
问题
在公司的一个项目开发时,遇到了一个类的属性无法注入的问题
public class DemoController extends BaseController implements BussinessProcessHandler {
@Autowired
DemoApi demoApi;
public void demo() {
demoApi.DemoService();
如上代码运行中报空指针异常,demoApi的实例为null,spring容器没有注入Bean。
原因
后来发现这个类DemoController的实例是反射生成的,并不由spring容器管理。
spring自动注入对象是通过创建一个BeanFactory并传入applicationContext配置文件对象,然后调用BeanFactory的getBean方法来实现相互依赖的对象获取和装配的。如果被注入的容器没有在spring bean中配置,而是通过反射途径生成,不能获取BeanFactory,就意味着不能进行自动注入。
解决办法
自己创建一个SpringUtil工具类组件,实现BeanFactoryAware或者ApplicationContextAware等spring提供的接口,并通过实例手动获取Spring管理的bean 。
@Component
public class SpringUtil implements ApplicationContextAware {
//ApplicationContext对象是Spring开源框架的上下文对象实例,在项目运行时自动装载Handler内的所有信息到内存。
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
//通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
手动获取bean实例
public class DemoController extends BaseController implements BussinessProcessHandler {
//@Autowired
//DemoApi demoApi;
public void demo() {
//通过class获取bean
DemoApi demoApi=SpringUtil.getBean(DemoApi.class);
demoApi.DemoService();
这样再运行demoApi就不为null了。
问题:使用@Autowired无法注入Bean对象版权声明:From Lay https://blog.csdn.net/Sadlay/article/details/82952163问题在公司的一个项目开发时,遇到了一个类的属性无法注入的问题public class DemoController extends BaseController implements BussinessPro...
<dependency>
<groupId>org.
springframework.boot</groupId>
<artifactId>
spring-boot-starter-test</artifactId>
<version>2.0.8.RELEASE</version>
在写一个工具类的时候遇到问题:使用@Autowired无法自动注入bean。报空指针异常,获取到的对象值为null。
经过一番摸索实践,探究到根本原因:工具类使用@Autowired无法注入bean的原因大多是因为使用了静态方法,相应的,使用@Autowired注入的对象也应该被static修饰,这样spring就无法正常注入bean,找到了原因,我也总结了三种解决方法。
第一种是我认为最简单...
经过几次的实验,终于发现在Controller中
使用@
Autowired注解错误及启动时提示没有
注入Bean的
问题。
1.
Autowired报红的
问题 可以通过搜索 Autowiring for
Bean Class把错误警告改成提示
2.针对启动时
无法注入Bean的
问题,必须在service层中的service接口的实现类上加入@Service或者@Component注解
在Spring框架中,@Autowired和@Bean都是用于依赖注入的注解。但是它们的用途和意义不同,因此不能简单地说哪一个先出现。
首先,@Bean注解是用于创建和配置bean的方法级别注解。当一个Java类被标记为@Bean时,Spring容器会自动创建该类的实例,并管理其生命周期。该注解通常用于将第三方库中的对象或复杂组件纳入Spring容器的管理下。
其次,@Autowired注解是用于自动装配bean之间的依赖关系的字段、方法或者构造函数级别的注解。在Spring容器启动时,会自动查找并注入所有被@Autowried注解标记的bean。这个注解通常用于将一个对象或组件注入到另一个对象中,以构建对象之间的依赖关系。
因此,两个注解都是Spring框架中重要的注解,分别用于创建和配置bean以及自动装配bean之间的依赖关系。它们的出现顺序也没有固定的规定。在实际使用时,根据功能需求选择合适的注解即可。