定义一个构造器:
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");
接口注入方式现在不提倡,基本处于退役状态。因为它强制注入对象实现不必要的接口,带有侵入性。被注入对象如果想要IOC Service Provider为其注入对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。
优点:对象在构造完成之后,即已经进入就绪状态,可以马上使用。缺点:通过反射构造对象的时候,对相同类型的参数的处理比较麻烦,维护和使用上也比较麻烦。构造方法无法被继承,无法设置默认值。而且参数的变动可能造成维护上的困难。
优点:setter方法可以被继承,可以设置默认值,而且有良好的IDE支持。缺点:对象构造完成后无法马上进入就绪状态。
首先,在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"));
转载于:https://www.cnblogs.com/liyuxinBlog/p/8367425.html
