• bean加载与注入之重新理解 L


    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

  • 相关阅读:
    Spring MVC与JAX-RS比较与分析
    JDK历史版本下载
    第六篇:为多态基类声明虚析构函数
    第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数
    第四篇:了解 C++ 默默编写并调用的函数
    第三篇:确保对象在被使用前的初始化
    poj 2125(最小割)
    hdu 4704(费马小定理)
    hdu 4705(树形DP)
    poj 3469(网络流模版)
  • 原文地址:https://www.cnblogs.com/codelocking/p/10731283.html
Copyright © 2020-2023  润新知