zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux/Android 系统怎么修改mac地址
    Vue.js和jQuery混合使用的一点注意事项
    wpf研究之道——datagrid控件及样式
    asp.net url重写
    如何解决一个问题
    Word 2007 封面、目录和正文页码单独设置
    .net 多线程
    我对asp.net运行机制的理解
    Firefox扩展安装
    谷歌chrome 插件(扩展)开发——谈谈安装
  • 原文地址:https://www.cnblogs.com/codelocking/p/10731283.html
Copyright © 2011-2022 走看看