JavaConfig原来是春天的一个子项目,它通过Java类的方式提供Bean的定义信息,在Spring4的版本,JavaConfig已正式成为Spring4的核心功能。
本文将详细介绍关于春天中基于Java类进行配置的相关内容、下面话不多说了,来一起看看详细的介绍吧
普通的POJO只要标注了@ configuration注解,就可以春天为容器提供Bean的定义信息。
@ configuration 公开课SystemConfig {/* * *定义Bean,并实例化 * * @return */@ bean 公共UserDao UserDao () { 返回新UserDao (); } @ bean 公共DeptDao DeptDao () { 返回新DeptDao (); }/* * *定义UserService,并把之前定义的UserDao与DeptDao注入进的来 * * @return */@ bean 公共UserService UserService () { UserService服务=new UserService (); service.setUserDao (userDao ()); service.setDeptDao (deptDao ()); 返回服务; } }
这个类的方法标注了@ Bean注解,即为定义Bean, Bean的类型由方法返回值的类型决定,名称默认和方法名同名,也可以通过入参显示指定Bean名称,比如@ Bean (name=" xxx ")。@ Bean所标注的方法体提供了实例化Bean的逻辑。
以上配置和下面的xml是等效的:
& lt; bean id=皍serDao”类=皀et.deniro.spring4.conf.UserDao”/比; & lt; bean id=癲eptDao”类=皀et.deniro.spring4.conf.DeptDao”/比; & lt; bean id=皍serService”类=皀et.deniro.spring4.conf.UserService” p: userDao-ref=" userDao " p: deptDao-ref=癲eptDao”/祝辞
基于Java类的配置方式和基于XML或者基于注解的配置方式相比,
-
<李> Java类的配置方式通过代码编程的方式,可以更加灵活地实例化Bean和装配豆之间的关系。李>
<李> XML或者基于注解的方式都是通过声明来定义配置的,所以灵活性上要逊一些,但在配置上更简单。李>
因为@ configuration注解类本身已经标注了@ component,所以这些类可以像那些普通的Bean一样被注入到其他的Bean中。
@ configuration 公开课ApplicationConfig { @ autowired 私人SystemConfig SystemConfig; @ bean 公共AuthorityService AuthorityService () { AuthorityService服务=new AuthorityService (); service.setUserDao (systemConfig.userDao ()); service.setDeptDao (systemConfig.deptDao ()); 返回服务; } }
春天会对配置类中所有标注了@ Bean的方法使用AOP增强,引入Bean的生命周期管理逻辑。比如上面的systemConfig.userDao(),它返回的是对应Bean的单例。
@ Bean中,在我们还可以通过标注@Scope注解来控制Bean的作用范围:
@Scope(“原型”) @ bean 公共DeptDao DeptDao () { 返回新DeptDao (); }
这样每次调用deptDao()方法都会返回一个新的实例:
assertNotSame (authorityService.getDeptDao () .hashCode (), authorityService .hashCode .getDeptDao () ());
注意:使用基于Java类进行配置,类路径下必须有Spring AOP与CGLib库。
<强> 2.1只使用@ configuration类强>
可以使用所类的构造函数传入标注了@ configuration的Java类来启动春容器。
=新所(SystemConfig ApplicationContext上下文 . class); UserService UserService=(UserService) context.getBean (“UserService”); assertNotNull (userService);
如果存在多个@ configuration配置类,那么可以所中注册它们,然后再通过刷新容器应用这些配置类:
所上下文=new所();//注册多个配置类 context.register (SystemConfig.class); context.register (ApplicationConfig.class);//刷新容器(应用这些配置类) context.refresh (); ApplicationConfig配置=context.getBean (ApplicationConfig.class);assertNotNull(配置);
也可以通过@ import将多个配置类组装到一个配置类中,然后仅需注册这个组装好的配置类,即可启动容器:
@ configuration @ import (SystemConfig.class) 公开课ApplicationConfig2 { @ autowired 私人SystemConfig SystemConfig; @ bean 公共AuthorityService AuthorityService () { AuthorityService服务=new AuthorityService (); service.setUserDao (systemConfig.userDao ()); service.setDeptDao (systemConfig.deptDao ()); 返回服务; } }在春天中基于Java类进行配置的完整步骤