Spring

1.springboot的自动装配原理

springboot启动以后:
通过@EnableAutoConigration里的@lmport (AutoConfigurationlmportSelector.class) 实现配置类的导入,但是并不是传统意义上的单个导入,而是批量进行导入
AutoConfigurationlmportSelector类实现了ImpotSelector接口,重写了selectlmports()方法,用于实现批量装配通过SpringFactoriesLoader机制,扫描classpath路径下的META-INF/spring.factories 读取需要实现自动装配的配置类最终通过筛选的方式,把不符合的类剔除,最终完成SpringBoot的自动装配
(springboot通过根据配置文件,自动装配所属依赖的类,再用动态代理的方式注入到spring容器中)

2.非Spring管理的类如何使用Spring的Bean

可以使用Spring的依赖注入功能将它们注入到Spring管理的Bean中。

两种方法将非Spring管理的类注入到Spring Bean中:

1). 在XML文件中定义Bean

通过在XML文件中定义一个Bean,并在其中注入非Spring管理的类来实现它们之间的联系。首先,您需要在XML文件中定义您的Bean和非Spring管理的类,例如:

<bean id="myNonSpringClass" class="com.example.MyNonSpringClass"/>

<bean id="mySpringClass" class="com.example.MySpringClass">
   <property name="nonSpringClass" ref="myNonSpringClass"/>
</bean>

接下来,在Spring管理的Bean中使用setter方法或构造函数注入非Spring管理的类。

1 public class MySpringClass {
2    private MyNonSpringClass nonSpringClass;
3 
4    public void setNonSpringClass(MyNonSpringClass nonSpringClass) {
5       this.nonSpringClass = nonSpringClass;
6    }
7 }

这个例子中,我们将MyNonSpringClass注入到了MySpringClass中的nonSpringClass属性中。

2).使用@Autowired注解

使用@Autowired注解将非Spring管理的类注入到Spring Bean中。要使用此方法,请确保在Spring配置文件中启用了自动装配功能:

<context:component-scan base-package="com.example"/>

现在,可以将@Autowired注解添加到MySpringClass中的非Spring管理的类。

1 public class MySpringClass {
2    @Autowired
3    private MyNonSpringClass nonSpringClass;
4 }

这样就可以自动将MyNonSpringClass注入到MySpringClass中的nonSpringClass属性中。

3.使用静态代码块在代码块里使用springUtil.getBean()方法给静态成员赋值

  1. 静态成员的初始化是在类加载的时候进行,并且只会执行一次。所以如果这个静态成员需要依赖 Spring 容器中的某个 Bean 进行初始化的话,就需要在静态代码块中调用 SpringUtil.getBean() 方法。

  2. 在使用 SpringUtil.getBean() 方法之前,需要先确保 Spring 容器已经初始化完毕。如果使用了注解配置方式,可以通过将配置类标注为 @Configuration 并在启动时加入相应的扫描路径来实现自动初始化;如果使用 XML 配置方式,则需要在启动时手动初始化 Spring 容器。

  3. 在使用 SpringUtil.getBean() 方法时,需要指定要获取的 Bean 的类型。如果指定的类型对应的 Bean 在容器中不存在,则会抛出异常。同时,也需要确保被依赖的 Bean 已经被正确地配置到容器中。

示例代码如下:

 1 public class MyClass {
 2     private static MyBean myBean;
 3 
 4     static {
 5         // 确保 Spring 容器已经初始化完毕
 6         ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
 7         
 8         // 使用 SpringUtil 获取 Bean 并赋值给静态成员
 9         myBean = SpringUtil.getBean(MyBean.class);
10     }
11 }

 

posted @ 2023-04-10 10:06  空空大首领  阅读(37)  评论(0编辑  收藏  举报