在写完Spring第二和第三篇后,去读了Spring In Action这本书…发现有知识点要补充,知识点跨越了第二和第三篇,所以专门再开一篇博文来写…java
因为Spring的自动装配并不能将第三方库组件装配到应用中,因而须要显式装配配置。显示装配有两种方式spring
Spring In Action做者首推使用自动装配的功能,然后是经过java代码配置bean,最后才用XML文件配置的方式..markdown
那么怎么经过java代码来配置Bean呢??app
@org.springframework.context.annotation.Configuration public class Configuration { }
@org.springframework.context.annotation.Configuration public class Configuration { @Bean public UserDao userDao() { UserDao userDao = new UserDao(); System.out.println("我是在configuration中的"+userDao); return userDao; } }
package bb; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.context.ContextConfiguration; /** * Created by ozc on 2017/5/11. */ //加载配置类的信息 @ContextConfiguration(classes = Configuration.class) public class Test2 { @Test public void test33() { ApplicationContext ac = new ClassPathXmlApplicationContext("bb/bean.xml"); UserDao userDao = (UserDao) ac.getBean("userDao"); System.out.println(userDao); } }
Spring in Action有两种方法(但我测试不出来,若是会的请在评论去告诉我.….)函数
import org.springframework.context.annotation.Bean; @org.springframework.context.annotation.Configuration public class Configuration { @Bean() public UserDao userDao() { return new UserDao(); } @Bean public UserService userService() { //直接调用@bean的方法 return new UserService(userDao()); } }
import org.springframework.context.annotation.Bean; @org.springframework.context.annotation.Configuration public class Configuration { @Bean() public UserDao userDao() { return new UserDao(); } @Bean public UserService userService(UserDao userDao) { //经过构造函数依赖注入 return new UserService(userDao); } }
import org.springframework.beans.factory.annotation.Autowire; import org.springframework.context.annotation.Bean; @org.springframework.context.annotation.Configuration public class Configuration { @Bean() public UserDao userDao() { return new UserDao(); } @Bean(autowire = Autowire.BY_TYPE) public UserService userService(UserDao userDao) { return new UserService(userDao); } }
public class Configuration { @Bean() public UserDao userDao() { return new UserDao(); } @Bean(autowire = Autowire.BY_TYPE) public UserService userService() { return new UserService(userDao()); } }
固然了,最简单直观的方法还有一种:在UserService中加入setUser()方法,那么只要set进去就好了..测试
public class UserService { private UserDao userDao ; public UserService() { } public UserService(UserDao userDao) { } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
import org.springframework.context.annotation.Bean; @org.springframework.context.annotation.Configuration public class Config1 { @Bean(name = "userDao") public UserDao userDao() { return new UserDao(); } @Bean(name="userService") public UserService userService() { UserService userService = new UserService(); userService.setUserDao(userDao()); return userService; } }
咱们在使用XML配置建立Bean的时候,若是该Bean有构造器,那么咱们使用<constructor-arg>
这个节点来对构造器的参数进行赋值…this
<constructor-arg>
未免有点太长了,为了简化配置,Spring来提供了c名称空间,其实和咱们以前讲到的p名称空间是同样的…spa
要想c名称空间是须要导入xmlns:c="http://www.springframework.org/schema/c"
的code
<bean id="userService" class="bb.UserService" c:userDao-ref=""> </bean>
c名称空间有个缺点:不能装配集合,当咱们要装配集合的时候仍是须要<constructor-arg>
这个节点xml
若是对象上的属性或者构造函数拥有集合的时候,而咱们又须要为集合赋值,那么怎么办?
<bean id="userService" class="bb.UserService" > <constructor-arg > <list> //普通类型 <value></value> </list> </constructor-arg> </bean>
<property name="userDao"> <list> <ref></ref> </list> </property>
咱们有的时候可能会两种配置混合时候…
若是JavaConfig的配置类是分散的,咱们通常再建立一个更高级的配置类(root),而后使用@Import来将配置类进行组合
若是XML的配置文件是分散的,咱们也是建立一个更高级的配置文件(root),而后使用来将配置文件组合
<bean>
节点就好了