前言
JavaConfig 原來是Spring 的一個子項目,它通過Java 類的方式提供Bean 的定義信息,在Spring4 的版本, JavaConfig 已正式成為Spring4 的核心功能。
本文將詳細介紹關於Spring中基於Java類進行配置的相關內容,下面話不多說了,來一起看看詳細的介紹吧
1 定義Bean
普通的POJO 只要標註了@Configuration 註解,就可以為Spring 容器提供Bean 的定義信息。
@Configurationpublic class SystemConfig { /** * 定義Bean,並實例化* * @return */ @Bean public UserDao userDao() { return new UserDao(); } @Bean public DeptDao deptDao() { return new DeptDao(); } /** * 定義UserService,並把之前定義的UserDao 與DeptDao 注入進來* * @return */ @Bean public UserService userService() { UserService service = new UserService(); service.setUserDao(userDao()); service.setDeptDao(deptDao()); return service; }}這個類的方法標註了@Bean 註解,即為定義Bean, Bean 的類型由方法返回值的類型決定,名稱默認和方法名同名,也可以通過入參顯示指定Bean 名稱,比如@Bean(name=”xxx”)。 @Bean 所標註的方法體提供了實例化Bean 的邏輯。
以上配置和下面的xml 是等效的:
<bean id="userDao"/><bean id="deptDao"/><bean id="userService"p:userDao-ref="userDao" p:deptDao-ref="deptDao"/>
基於Java 類的配置方式和基於XML 或者基於註解的配置方式相比――
因為@Configuration 註解類本身已經標註了@Component,所以這些類可以像那些普通的Bean 一樣被注入到其他的Bean 中。
@Configurationpublic class ApplicationConfig { @Autowired private SystemConfig systemConfig; @Bean public AuthorityService authorityService() { AuthorityService service = new AuthorityService(); service.setUserDao(systemConfig.userDao()); service.setDeptDao(systemConfig.deptDao()); return service; }}Spring 會對配置類中所有標註了@Bean 的方法使用AOP 增強,引入Bean 的生命週期管理邏輯。比如上面的systemConfig.userDao(),它返回的是對應Bean 的單例。
在@Bean 中,我們還可以通過標註@Scope 註解來控制Bean 的作用範圍:
@Scope("prototype")@Beanpublic DeptDao deptDao() { return new DeptDao();}這樣每次調用deptDao() 方法都會返回一個新的實例:
assertNotSame(authorityService.getDeptDao().hashCode(),authorityService .getDeptDao().hashCode());
注意: 使用基於Java 類進行配置,類路徑下必須有Spring AOP 與CGLib 庫。
2 啟動Spring 容器
2.1 只使用@Configuration 類
可以使用AnnotationConfigApplicationContext 類的構造函數傳入標註了@Configuration 的Java 類來啟動Spring 容器。
ApplicationContext context=new AnnotationConfigApplicationContext(SystemConfig .class);UserService userService= (UserService) context.getBean("userService");assertNotNull(userService);如果存在多個@Configuration 配置類,那麼可以AnnotationConfigApplicationContext 中註冊它們,然後再通過刷新容器應用這些配置類:
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();//註冊多個配置類context.register(SystemConfig.class);context.register(ApplicationConfig.class);//刷新容器(應用這些配置類)context.refresh();ApplicationConfig config=context.getBean(ApplicationConfig.class);assertNotNull(config);
也可以通過@Import 將多個配置類組裝到一個配置類中,然後僅需註冊這個組裝好的配置類,即可啟動容器:
@Configuration@Import(SystemConfig.class)public class ApplicationConfig2 { @Autowired private SystemConfig systemConfig; @Bean public AuthorityService authorityService() { AuthorityService service = new AuthorityService(); service.setUserDao(systemConfig.userDao()); service.setDeptDao(systemConfig.deptDao()); return service; }}單元測試:
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ApplicationConfig2.class);ApplicationConfig2 config=context.getBean(ApplicationConfig2.class);assertNotNull(config);final AuthorityService authorityService = config.authorityService();assertNotNull(authorityService.getDeptDao());assertNotSame(authorityService.getDeptDao().hashCode(),authorityService .getDeptDao().hashCode());
2.2 使用XML 文件引用@Configuration 類的配置
標註了@Configuration 的配置類也是一個Bean,所以它也可以被Spring 的<context:component-scan> 掃描到。 因此如果希望將配置類組裝到XML 的配置文件中,並通過XML 的配置文件啟動Spring,那麼僅需要在XML 中通過<context:component-scan> 掃描到相應的配置類即可。
<context:component-scan base-package="net.deniro.spring4.conf" resource-pattern="ApplicationConfig2.class" />
2.3 在@Configuration 類中引用XML 文件的配置
在@Configuration 配置類中可以直接通過@ImportResource 引入XML 的配置文件,這樣就可以直接通過@Autowired 引用xml 配置文件中定義的Bean。
配置文件:
<bean id="groupDao"/><bean id="roleDao"/>
@Configuration 類:
@ImportResource("classpath:beans5-11.xml")@Configurationpublic class ServiceConfig { @Bean @Autowired public RelationService relationService(GroupDao groupDao,RoleDao roleDao){ RelationService service=new RelationService(); service.setGroupDao(groupDao); service.setRoleDao(roleDao); return service; }}單元測試:
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext (ServiceConfig.class);ServiceConfig config=context.getBean(ServiceConfig.class);assertNotNull(config);RelationService service=config.relationService((GroupDao) context.getBean ("groupDao"), (RoleDao) context .getBean ("roleDao"));assertNotNull(service.getRoleDao());只要這些不同形式Bean 的定義信息能夠加載到Spring 容器中,那麼Spring 就可以智能的完成Bean 之間的裝配。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。