Spring-基于Java类的配置
- 概述
- 使用Java類提供Bean定義信息
- 實例
- 分析
- 使用基于Java類的配置信息啟動Spring容器
- 直接通過Configuration啟動Spring容器
- 通過AnnotationConfigApplicationContext的構造函數加載配置類
- 通過編碼的方式加載多個Configuration配置類然后通過刷新容器應用這些配置類
- 通過Import將多個配置類組裝到一個配置類中然后僅需注冊這個組裝好的配置類 啟動容器
- 通過XML配置文件引用Configuration配置
- 通過Configuration配置類引用XML配置信息
- 直接通過Configuration啟動Spring容器
概述
JavaConfig是Spring的一個子項目,它旨在通過Java類的方式提供Bean的定義信息,在Spring4.0的版本,JavaConfig正式成為Spring4.0的核心功能。
使用Java類提供Bean定義信息
普通的POJO只要標注了@Configuration注解,就可以為Spring容器提供Bean定義的信息,每個標注了@Bean的類方法都相當于提供一個Bean的定義信息。
實例
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
POJO
package com.xgj.ioc.javaConfig;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;// 將一個POJO標注為定義Bean的配置類 @Configuration public class Teacher {/*** * * @Title: studentOne* * @Description: 定義了一個Bean,并提供了Bean的實例化邏輯* * @return* * @return: StudentOne*/@Beanpublic StudentOne studentOne() {return new StudentOne();}/*** * * @Title: studentTwo* * @Description: 定義了一個Bean,并提供了Bean的實例化邏輯* * @return* * @return: StudentTwo*/@Beanpublic StudentTwo studentTwo() {return new StudentTwo();}public void arrangeStudent() {studentOne().doCleanWork();studentTwo().doHomeWork();}} package com.xgj.ioc.javaConfig;public class StudentOne {public void doCleanWork() {System.out.println("StudentOne will do CleanWork");} } package com.xgj.ioc.javaConfig;public class StudentTwo {public void doHomeWork() {System.out.println("StudentTwo will do HomeWork");} }測試類
package com.xgj.ioc.javaConfig;import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class JavaConfigTest {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(Teacher.class);ctx.getBean("teacher", Teacher.class).arrangeStudent();} }運行結果
分析
Teacher類的定義出標注了@Configuration注解,說明這個類可以用于為Spring提供Bean的定義信息。
該類的方法可以標注@Bean注解,Bean的類型由方法返回值的類型決定,名稱默認和方法名同名,當然也可以通過入參顯示指定Bean名稱,比如@Bean(name=”coolStudent”).
@Bean所標注的方法體提供了Bean的實例化邏輯。
studentOne()和studentTwo()方法分別定義了一個StudentOne 和 StudentTwo類型的Bean, 他們的Bean名稱分別為 studentOne 和 studentTwo。
在arrangeStudent()方法中 注入了上面實例化的兩個Bean。
以上配置和下面的xml是等效的
<bean id="studentOne" class="com.xgj.ioc.javaConfig.StudentOne"/> <bean id="studentTwo" class="com.xgj.ioc.javaConfig.StudentTwo"/> <bean id="teacher" class="com.xgj.ioc.javaConfig.Teacher" p:sutdentOne-ref="studentOne" p:studentTwo-ref="studentTwo"/>基于Java類的配置方式和基于XML或者基于注解的配置方式相比,前者通過代碼編程的方式可以更加靈活的實現Bean的實例化及Bean之間的裝配,后兩者都是通過配置聲明的方式,在靈活性上要稍遜一些,但在配置上要更簡單一些。
使用基于Java類的配置信息啟動Spring容器
1.直接通過@Configuration啟動Spring容器
Spring提供了AnnotationConfigApplicationContext類,它能夠直接通過標注@Configuration的Java類啟動Spring容器。
通過AnnotationConfigApplicationContext的構造函數加載配置類
比如我們上面的那個例子的測試類
package com.xgj.ioc.javaConfig;import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class JavaConfigTest {public static void main(String[] args) {// (1)通過構造函數加載配置類 ApplicationContext ctx = new AnnotationConfigApplicationContext(Teacher.class);ctx.getBean("teacher", Teacher.class).arrangeStudent();} }在(1)處,通過AnnotationConfigApplicationContext類的構造函數直接傳入標注了@Configuration的JAVA類,這屆用該類中提供的Bean定義信息啟動Spring容器。
通過編碼的方式加載多個@Configuration配置類,然后通過刷新容器應用這些配置類
package com.xgj.ioc.javaConfig;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class JavaConfigTest {public static void main(String[] args) {// 通過構造函數加載配置類// ApplicationContext ctx = new AnnotationConfigApplicationContext(// Teacher.class);AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();// 注冊@Configuration的配置類,可注冊多個ctx.register(Teacher.class);// 刷新容器以應用這些注冊的配置類ctx.refresh();Teacher teacher = ctx.getBean("teacher", Teacher.class);teacher.arrangeStudent();} }通過@Import將多個配置類組裝到一個配置類中,然后僅需注冊這個組裝好的配置類 ,啟動容器
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import;@Configuration @Import(DaoConfig.class) public class ServiceConfig {@Autowiredprivate DaoConfig daoConfig;@Beanpublic LogonService logonService(){LogonService logonService = new LogonService();System.out.println(daoConfig.logDao() == daoConfig.logDao());logonService.setLogDao(daoConfig.logDao());logonService.setUserDao(daoConfig.userDao());return logonService;} }AnnotationConfigApplicationContext的主要方法
2.通過XML配置文件引用@Configuration配置
標注了@Configuration的配置類和標注了@Component的類一樣也是一個Bean, 同樣的 它也可以被Spring的<context:component-scan>掃描到。 因此如果希望將配置類組裝到XML的配置文件中,通過XML的配置文件啟動Spring,這僅需要在XML子中通過<context:component-scan>掃描到相應的配置類即可。
我們改造下上面的測試類
增加配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- (1)聲明Context命名空間以及Schema文件 (2)掃描類包以及應用注解定義的bean resource-pattern 看需求,可配置可不配置 --><context:component-scan base-package="com.xgj.ioc.javaConfig"resource-pattern="Teacher.class" /></beans> package com.xgj.ioc.javaConfig;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class JavaConfigTest {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/ioc/javaConfig/beans.xml");Teacher teacher = ctx.getBean("teacher", Teacher.class);teacher.arrangeStudent();} }同樣也可以正確的加載并實例化Bean
2017-07-31 22:03:02,093 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@d167d36: startup date [Mon Jul 31 22:03:02 BOT 2017]; root of context hierarchy 2017-07-31 22:03:02,176 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/ioc/javaConfig/beans.xml] StudentOne will do CleanWork StudentTwo will do HomeWork3.通過@Configuration配置類引用XML配置信息
假設bean中有兩個Bean ,如下
<bean id="userDao" class="com.xgj.ioc.javaConfig.UserDao"/> <bean id="logDao" class="com.xgj.ioc.javaConfig.LogDao"/>在@Configuration配置類中可以直接通過@ImportResource引入XML的配置那文件,這樣就就可以直接通過@Autowired引用xml配置文件中定義的Bean。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource;@Configuration @ImportResource("classpath:com/xgj/ioc/javaConfig/beans.xml") public class LogonAppConfig {@Bean@Autowiredpublic LogonService logonService(UserDao userDao,LogDao logDao){LogonService logonService = new LogonService();logonService.setUserDao(userDao);logonService.setLogDao(logDao);return logonService; } }通過@ImportResource引入XML配置文件
通過@Bean定義一個LogonService 的bean
通過@Autowired自動注入userDao和logDao ,這兩個Bean是在XML配置文件中定義的。
需要說明的是,@ImportResource引入XML配置文件,不是@Autowired處可成功注入到對應Bean的前提條件。 只要不同形式的Bean定義信息能夠加載到Spring容器中,Spring就可以智能的完成Bean之間的裝配。
總結
以上是生活随笔為你收集整理的Spring-基于Java类的配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-基于注解的配置[03Bea
- 下一篇: Java-JDK动态代理