天天看点

bean加载与注入之重新理解

1、@Autowired注解不可以用在静态属性上;

解决方法:

  • 使用实现了ApplicationContextAware接口的自定义工具类,ApplicationContextAware可以让我们获得spring的上下文对象ApplicationContext,通过ApplicationContext

    的getBean方法可以获得指定类的Bean对象。举例如下:

@Component
public class contextTest implements ApplicationContextAware {

    private static UserService userService;

    private static UserService2 userService2;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

          userService = applicationContext.getBean(UserService.class);

          userService2 = applicationContext.getBean(UserService2.class);
    }
}
           
// UserService
@Service
public class UserService {

    public void test(){
        System.out.println("UserService test executed...");
    }
}
           
//UserService2
@Service
public class UserService2 {

    public void test(){
        System.out.println("UserService2 test executed...");
    }
}
           

注:这里理解一下ApplicationContextAware接口的一种简单使用场景。

在非spring托管的类中 ,我们往往也需要引入spring IOC容器中的bean对象,然而在非spring托管的类中我们是不能使用@Autowired直接将bean对象引入。

由于实现ApplicationContextAware接口的类可以管理spring上下文ApplicationContext,从ApplicationContext中我们就可以得到IOC容器中的bean对象,如此

我们在非spring托管的类中只需要继承这个类就可以得到这些bean对象的使用。下面是一个完整的例子:
           
UserService 和 UserService2这两个类如上面所示;
           
//实现ApplicationContextAware接口的类
@Component
public class contextTest implements ApplicationContextAware {

    private static UserService userService;

    private static UserService2 userService2;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        userService = applicationContext.getBean(UserService.class);
        userService2 = applicationContext.getBean(UserService2.class);
    }

    public static UserService getUserService() {
        return userService;
    }

    public static UserService2 getUserService2() {
        return userService2;
    }
}
           
public class BaseContextTest {

    protected UserService userService = contextTest.getUserService();

    protected UserService2 userService2 = contextTest.getUserService2();
}
           
对于非spring托管的类,想使用被spring托管的userService和userService2,只需要继承BaseContextTest就可以使用了。
           
  • 使用@autowired 标签进行set方法注入
@Component
public class contextTest {

    private static UserService userService;

    @Autowired
    public void setUserService(UserService userService){
        contextTest.userService = userService;
        System.out.println(userService);
    }
}
           

2、@Autowired使用

  • 若被注解的类对象在IOC中还不存在,则需要临时将该类加载到IOC中,加载完成之后再将bean对象注入;
  • 若IOC中已经存在该Bean,则只需要注入bean即可;

3、bean的加载和注入是两种不同的过程:

  • 加载是将被spring托管的类变成IOC容器中的bean的过程
  • 注入是将IOC容器中的bean对象赋给其它变量的过程

    被@Controller、@Service、@Component等注解的类在springboot启动时会将这些类加载到IOC容器中。

如有错误之处,请不吝赐教。

参考博文:https://blog.csdn.net/lazy_zzzzzz/article/details/87814603