• 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

  • 相关阅读:
    十六.jQuery源码解析之Sizzle设计思路.htm
    关于微信浏览不能URL传参,URL中的问号被删除
    websocket 通信协议
    java_httpservice
    Socket.Io 做个标记 下来了解下
    通过netty实现服务端与客户端的长连接通讯,及心跳检测。
    NETTY 编码器介绍
    Netty4.0学习教程
    FORM表单不刷新提交POST数据
    Linux0.11学习
  • 原文地址:https://www.cnblogs.com/codelocking/p/10731283.html
Copyright © 2020-2023  润新知