类中属性注入的三种方式:
接口注入
public interface Injection{
public void setName(String name);
}
public class User implements Injection{
private String name;
public void setName(String name){
this.name = name;
}
}
构造方法注入
public class User{
private String name;
public User(String name){
this.name = name;
}
}
setter注入
public class User{
private String name;
public void setName(String name){
this.name = name;
}
}
Spring中支持后两种。并且从spring2.5版本开始引入了名称空间p.可以使用名称空间p:注入属性。从Spring3.0开始可以使用SpEL(Spring Expression Language)注入属性,语法:#{表达式};
<property id="" value="#{表达式}"/>
一、基于XML配置
构造方法注入和setter注入
<!--1.使用带参构造方法注入属性值-->
<bean id="customer" class="com.wl.spring.demo2.Customer">
<constructor-arg value="苏福" name="name"/>
<!--<constructor-arg index="0" value="苏福"/>-->
<!--<constructor-arg index="1" value="20"/>-->
<constructor-arg value="20" name="age"/>
</bean>
<!--2.通过setter方法注入属性值(一般使用这个)-->
<bean id="customer2" class="com.wl.spring.demo2.Customer2">
<property name="name" value="扶苏" />
<property name="age" value="20"/>
</bean>
名称空间p注入
加上下面这行即可使用名称空间p
xmlns:p="http://www.springframework.org/schema/p"
<!--使用名称空间p:注入属性-->
<bean id="car" class="com.wl.spring.demo2.Car" p:carName="特斯拉" p:price="800000"/>
<bean id="customer2" class="com.wl.spring.demo2.Customer2" p:age="20" p:name="扶苏" p:car-ref="car"/>
SpEL注入属性
<!--使用SpEL注入属性值-->
<bean id="car" class="com.wl.spring.demo2.Car">
<property name="carName" value="#{'劳斯莱斯'}"/>
<property name="price" value="#{3000000}"/>
</bean>
<bean id="customer2" class="com.wl.spring.demo2.Customer2" >
<property name="name" value="#{'扶苏'}"/>
<property name="age" value="#{20}"/>
<property name="car" value="#{car}"/>
</bean>
对集合类型的属性注入方式
<!--对集合类型的属性注入-->
<bean id="collectionBean" class="com.wl.spring.demo3.CollectionBean">
<property name="list" >
<list>
<value>麦克雷</value>
<value>汉尼拔</value>
<value>巨石强森</value>
</list>
</property>
<property name="set">
<set>
<value>盖伦</value>
<value>盖伦</value>
<value>亚索</value>
</set>
</property>
<property name="map">
<map>
<entry key="1" value="提莫"/>
<entry key="2" value="小炮"/>
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
</bean>
二、基于注解注入
使用注解方式注入需要先在配置文件中加上:
<context:component-scan base-package="com.wl.spring_annotation.demo1"/>
开启注解自动扫描。不需要配置bean。
@Controller("userController")
@Scope("singleton")
public class UserController {
// @Autowired
// @Qualifier("userService")//加上的话使用名称注入,不加的话使用类型注入
@Resource(name = "userService")//等于上面两句
private UserService userService;
@Value(value ="UserControllerInfo")//普通属性注入
private String info;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void addUser(){
userService.addUser();
System.out.println(this.info);
}
@PostConstruct
public void setUp(){
System.out.println("初始化...");
}
@PreDestroy
public void tearDown(){
System.out.println("销毁...");
}
}
@Controller("userController")加在类前面,相当于bean配置中的id属性。
@Scope("singleton")相当于bean配置中的scope属性,默认为singleton。prototype为多例。
@Value(value ="UserControllerInfo"):配置于普通属性前,为其设置值
@Autowired @Qualifier("userService"):配置于引用属性前,开启该属性自动装配。相当于@Resource(name = "userService")。
@PostConstruct:配置于初始化方法前,指定该方法为初始化方法。
@PreDestroy:配置于销毁方法前,指定该方法为销毁方法。(销毁方法只对singleton有效)
三、实际开发过程中使用XML还是注解?
两种方式结合使用。使用XML注册Bean,使用注解进行属性的注入。
配置文件中:
<!--配置启用注解-->
<context:annotation-config/>
<bean id="userDao" class="com.wl.spring_annotation.demo2.UserDao"/>
<bean id="userService" class="com.wl.spring_annotation.demo2.UserService"/>
<bean id="userController" class="com.wl.spring_annotation.demo2.UserController"/>
配置文件中可以不用进行属性的注入,只是声明注册Bean即可.
具体类中:
@Controller
public class UserController {
@Resource(name = "userService")
private UserService service;
public void addUser(){
service.addUser();
}
@PostConstruct
public void setUp(){
System.out.println("初始化...");
}
@PreDestroy
public void tearDown(){
System.out.println("销毁...");
}
// public void setService(UserService service) {
// this.service = service;
// }
}
具体类中可以不用对属性提供setter方法,使用注解开启自动装配即可。