1. 自动化装配Bean
1.@ComponentScan
@ComponentScan 配置在类上,如果没有设置
属性 basePackages(即values)的值来指定包,会扫描该类所在包及其子包下的 @Component注解, 将其注册为 bean 对象
实例:
@ComponentScan
public class StudentHelper {
}
其他类上都包含 @Component注解 ,StudentHelper 类上有 @ComponentScan 注解
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = StudentHelper.class) // 加载StudentHelper类
public class Test01 {
@Autowired
private StudentDao studentDao;
@Autowired
private AnotherTeacher anotherTeacher;
@Autowired
private Teacher teacher;
@Test
public void test1() {
studentDao.eat();
}
@Test
public void test2() {
teacher.teach();
anotherTeacher.sayHello();
}
}
执行test1 、test2 均输出正确结果,说明 StudentDaoImpl 、 Teacher、 AnotherTeacher 被成功扫描并注册为 Bean
2.使用JavaConfig装配Bean
该方式不再在原来的Bean上添加注解@Component或 @ComponentScan或 @Autowired, 而是创建单独的JavaConfig类,用于创建各种Bean对象
用@Configuration注解该类,等价 在XML中配置beans;用@Bean标注方法等价于XML中配置bean。
public class Phone {
public void call(){
System.out.println("打电话");
}
}
public class Computer {
public void code(){
System.out.println("敲代码");
}
}
public class Student {
private Computer computer;
private Phone phone;
public Student(Computer computer,Phone phone){
this.computer = computer;
this.phone= phone;
}
public void study(){
System.out.println("学习");
}
public void code(){
computer.code();
}
public void call(){
phone.call();
}
}
配置Bean的类:
@Configuration // 要加@Configuration 注解
public class StudentConfig {
@Bean // Bean注解
public Phone phone(){
return new Phone();
}
@Bean
public Computer computer(){
return new Computer();
}
@Bean(name="student") // 默认Bean的name 即为方法名
public Student student(Computer computer,Phone phone){
return new Student(computer, phone);
}
}
测试:
public class TestBean {
@Test // 通过手动加载的方式测试
public void b() {
ApplicationContext context = new AnnotationConfigApplicationContext("com.example.bean"); // 注意,这里是配置类 StudentConfig 所在包的包名,不是
Student student = context.getBean("student", Student.class);
student.call();
student.code();
student.study();
}
}
也可以通过上面例子中依赖注入的方式获取Student对象,进行测试
3.导入和混合配制(JavaConfig和XML)
1.JavaConfig中引用Xml
当 StudentConfig 中Bean太多,需要进行拆分
1)以JavaConfig方式分离出去
例如:将 Computer 这个Bean 单独拆分出去, 新建ComputerConfig 配置Bean
@Configuration
public class ComputerConfig {
@Bean
public Computer computer(){
return new Computer();
}
}
现在要考虑的就是将 独立出去的ComputerConfig 和 原先的 StudentConfig 联系到一起
方法一: 在StudentConfig类上 添加 @Import(ComputerConfig.class)
@Configuration
@Import(ComputerConfig.class)
public class StudentConfig {
@Bean
public Phone phone(){
return new Phone();
}
@Bean(name="student")
public Student student(Computer computer,Phone phone){
return new Student(computer, phone);
}
}
方法二: 创建一个联合类,将ComputerConfig和 StudentConfig 组合在一起
@Configuration
@Import({StudentConfig.class,ComputerConfig.class})
public class CombinedConfig {
}
2)以xml方式分离出去
classpath: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="computer" class="com.example.bean.Computer"/>
</beans>
@ImportResource("") , 在JavaConfig类中引用Xml配置的Bean对象
创建组合类,通过@ImportResource和@Import 将Computer 类与 StudentConfig类进行组合
@Configuration
@Import(StudentConfig.class)
@ImportResource("classpath:applicationContext.xml")
public class CombinedConfig {
}
2.在Xml中引用JavaConfig类
假设
Student
和Computer
原本都配置在applicationContext.xml
中,现需要拆分 Bean 配置,将Computer
以拆分出去到
computer.xml,在 原来的
xml中需要用 import 导入
Computer`的xml配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath: computer.xml" />
<bean id="computer" class="com.example.bean.Student"/>
</beans>
如果
Computer
以JavaConfig
的方式拆分出去,那么在上面的xml 配置文件如何引用Computer
对应的JavaConfig
呢? import 标签只能导入 其他xml文件
ComputerConfig.java
@Configuration
public class ComputerConfig {
@Bean
public Computer computer(){
return new Computer();
}
}
方法一: 在applicationContext.xml
配置 ComputerConfig.java
的bean
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.example.bean.ComputerConfig" />
<bean id="student" class="com.example.bean.Student">
<constructor-arg ref="computer"/> <!--和ComputerConfig中方法computer名保持一致-->
<constructor-arg ref="phone"/>
</bean>
<bean id="phone" class="com.example.bean.Phone" />
</beans>
方法二: 使用第三方xml 文件,组合 ComputerConfig
和 applicationContext.xml
combinedContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.example.bean.ComputerConfig" />
<import resource="classpath:applicationContext.xml" />
</beans>