Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】
来源:互联网 发布:golang 2.0教程 编辑:程序博客网 时间:2024/06/10 12:00
前言
在写完Spring第二和第三篇后,去读了Spring In Action这本书…发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写…
通过java代码配置bean
由于Spring的自动装配并不能将第三方库组件装配到应用中,于是需要显式装配配置。显示装配有两种方式
- 通过java代码装配bean
- 通过XML装配bean
Spring In Action作者首推使用自动装配的功能,而后是通过java代码配置bean,最后才用XML文件配置的方式..
那么怎么通过java代码来配置Bean呢??
- 编写一个java类,使用@Configuration修饰该类
- 被@Configuration修饰的类就是配置类
编写配置类
@org.springframework.context.annotation.Configuration public class Configuration { }
使用配置类创建bean
- 使用@Bean来修饰方法,该方法返回一个对象。
- 不管方法体内的对象是怎么创建的,Spring可以获取得到对象就行了。
- Spring内部会将该对象加入到Spring容器中
- 容器中bean的ID默认为方法名
@org.springframework.context.annotation.Configurationpublic class Configuration { @Bean public UserDao userDao() { UserDao userDao = new UserDao(); System.out.println("我是在configuration中的"+userDao); return userDao; }}
- 测试代码:要使用@ContextConfiguration加载配置类的信息【引入test包】
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.Configurationpublic 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.Configurationpublic 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.Configurationpublic class Configuration { @Bean() public UserDao userDao() { return new UserDao(); } @Bean(autowire = Autowire.BY_TYPE) public UserService userService(UserDao userDao) { return new UserService(userDao); }}
- 我测试中只有通过这种方法才能拿到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进去就行了..
- UserService
public class UserService { private UserDao userDao ; public UserService() { } public UserService(UserDao userDao) { } public void setUserDao(UserDao userDao) { this.userDao = userDao; }}
- Config
import org.springframework.context.annotation.Bean;@org.springframework.context.annotation.Configurationpublic 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; }}
c名称空间
我们在使用XML配置创建Bean的时候,如果该Bean有构造器,那么我们使用<constructor-arg>
这个节点来对构造器的参数进行赋值…
<constructor-arg>
未免有点太长了,为了简化配置,Spring来提供了c名称空间,其实和我们之前讲到的p名称空间是一样的…
要想c名称空间是需要导入xmlns:c="http://www.springframework.org/schema/c"
的
<bean id="userService" class="bb.UserService" c:userDao-ref=""> </bean>
c名称空间有个缺点:不能装配集合,当我们要装配集合的时候还是需要<constructor-arg>
这个节点
装载集合
如果对象上的属性或者构造函数拥有集合的时候,而我们又需要为集合赋值,那么怎么办?
- 在构造函数上,普通类型
<bean id="userService" class="bb.UserService" > <constructor-arg > <list> //普通类型 <value></value> </list> </constructor-arg> </bean>
- 在属性上,引用类型
<property name="userDao"> <list> <ref></ref> </list> </property>
JavaConfig与XML组合
我们有的时候可能会两种配置混合时候…
如果JavaConfig的配置类是分散的,我们一般再创建一个更高级的配置类(root),然后使用@Import来将配置类进行组合
如果XML的配置文件是分散的,我们也是创建一个更高级的配置文件(root),然后使用来将配置文件组合
在JavaConfig引用XML
- 使用@ImportResource()
在XML引用JavaConfig
- 使用
<bean>
节点就行了
- Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】
- Spring实战——XML和JavaConfig的混合配置
- Spring实战——XML和JavaConfig的混合配置
- Spring web基于javaconfig类配置 的web.XML配置
- 译--Spring中 bean定义profiles的使用 javaConfig 和XML配置
- spring-javaconfig
- Spring基础_在JavaConfig中引用xml配置<四>
- Spring基础_在XML配置中引用JavaConfig<五>
- 如何使用Javaconfig代替web.xml配置spring
- JavaConfig
- javaConfig
- springmvc的javaconfig的配置
- spring-配置bean(2、基于JavaConfig的配置)
- 关于spring data redis使用javaConfig的基本配置
- 用javaConfig注解创建spring 工程的基本配置
- 利用JavaConfig配置Spring及SpringMvc的开发环境
- Spring MVC 零配置 / Spring MVC JavaConfig
- 考虑使用JavaConfig替代XML配置
- 项目中常用到的第三发方ar包参考
- Service
- Tomcat 发布时war解压
- Intellij-idea 如何编译maven工程
- 山东省第八届ACM省赛 K 题(CF)
- Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】
- [cocos2dx]在cocos2dx中使用iconv库解决中文乱码
- Cookie、session、application
- Android 实现简单的音乐播放器效果(音频文件的三种存放)
- 521. Longest Uncommon Subsequence I
- vpp命令总结
- C++实验6
- (1) 编写服务器与客户端
- Winsocket编程,事件选择模型+mysql简易聊天室,含登录同步离线消息