Spring實戰之(1)裝配Bean

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類

假設 StudentComputer原本都配置在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>

如果 ComputerJavaConfig的方式拆分出去,那么在上面的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 文件,組合 ComputerConfigapplicationContext.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>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本章內容: 聲明Bean 構造器注入和Setter方法注入 裝配Bean 控制bean的創建和銷毀 任何一個成功的...
    謝隨安閱讀 1,662評論 0 9
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,951評論 6 342
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • 2.1 Spring配置的可選方案 Spring提供了三種主要的裝配機制: 1)在XML中進行顯示配置。2)在ja...
    如一諾然閱讀 503評論 0 1
  • 我們
    大魔王Ares閱讀 147評論 0 1