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>