spring学习(二)—bean的装配
1.在xml中显示配置的方式
1.1构造方法注入
定义一个构造器:
public Roles(int id,String roleName,User user){ this.id=id; this.roleName=roleName; this.user=user; } public User(int id,String name){ this.id=id; this.name=name; }
spring的配置文件:
<bean id="roles" class="com.lyx.model.Roles"> <constructor-arg value="0"/> <constructor-arg value="管理员"/> <constructor-arg ref="user"/> </bean> <bean id="user" class="com.lyx.model.User"> <constructor-arg value="1"/> <constructor-arg value="li"/> </bean>
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); Roles u = (Roles)context.getBean("roles");
1.2setter方法注入
<bean id="roles" class="com.lyx.model.Roles"> <property name="id" value="0"/> <property name="roleName" value="管理员"/> <property name="user" ref="user"/> </bean> <bean id="user" class="com.lyx.model.User"> <property name="id" value="1"/> <property name="name" value="li"/> </bean>
当注入是其他类型
1 <bean id="user" class="com.lyx.model.User"> 2 <property name="name" value="li"/> 3 <property name="list"> 4 <list> 5 <value>a<value> 6 <value>b<value> 7 </list> 8 <!-- 如果传入是数组,则跟list一样 --> 9 <!-- 如果传入set集合,只需把list标签换成set。--> 10 <!-- map集合的注入 --> 11 <property name="map"> 12 <map> 13 <entry key="key1" value="map1"></entry> 14 <entry key="key2" value="map2"></entry> 15 </map> 16 </property> 17 </property> 18 </bean>
1.3接口注入
接口注入方式现在不提倡,基本处于退役状态。因为它强制注入对象实现不必要的接口,带有侵入性。被注入对象如果想要IOC Service Provider为其注入对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。
1.4两种注入方法的比较
1.4.1 构造方法注入
优点:对象在构造完成之后,即已经进入就绪状态,可以马上使用。缺点:通过反射构造对象的时候,对相同类型的参数的处理比较麻烦,维护和使用上也比较麻烦。构造方法无法被继承,无法设置默认值。而且参数的变动可能造成维护上的困难。
1.4.2setter方法注入
优点:setter方法可以被继承,可以设置默认值,而且有良好的IDE支持。缺点:对象构造完成后无法马上进入就绪状态。
2.在java中进行显示配置
首先,在spring的配置文件启用注解:
<context:component-scan base-package="com.lyx" />
创建配置类,如:
@Configuration public class DBConfiguration{ @Bean(name = "dataSource") public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(driverUrl); dataSource.setUsername(driverUsername); dataSource.setPassword(driverPassword); return dataSource; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } }
其中@Configuration注解相当与XML配置文件中的<beans>标签,@Bean相当于<bean>标签。@Bean注解name属性默认名就是方法名,返回值是bean对象。使用@Bean注解的方法不能是private、final或static的。
测试方法:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(DBConfiguration.class); Assert.assertEquals(dataSource, ctx.getBean("dataSource"));
浙公网安备 33010602011771号