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()方法给静态成员赋值
-
静态成员的初始化是在类加载的时候进行,并且只会执行一次。所以如果这个静态成员需要依赖 Spring 容器中的某个 Bean 进行初始化的话,就需要在静态代码块中调用
SpringUtil.getBean()
方法。 -
在使用
SpringUtil.getBean()
方法之前,需要先确保 Spring 容器已经初始化完毕。如果使用了注解配置方式,可以通过将配置类标注为@Configuration
并在启动时加入相应的扫描路径来实现自动初始化;如果使用 XML 配置方式,则需要在启动时手动初始化 Spring 容器。 -
在使用
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 }