一、XML方式的属性注入
1、构造方法注入
通过构造方法注入bean的属性值或依赖的对象,保证bean实例在实例化后就可以使用。
构造器注入在元素里声明属性
bean
package com.zqh.service;
public class UserServiceImpl implements UserService {
private String name;
//构造方法
public UserServiceImpl(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("save"+name);
}
}
xml配置
<bean id="userService" class="com.zqh.service.UserServiceImpl">
<!--通过构造方法将属性注入bean-->
<!--
index:参数位置,第一个为0
name:参数名称
value:参数值
type:参数类型
ref:参数引用可以是另一个spring容器中的bean
-->
<constructor-arg name="name" value="张"></constructor-arg>
</bean>
2、SET方法注入
set方法注入设置注入的属性
set方法支持属性注入的类型
1、基本类型
2、pojo
3、集合类型
4、properties类型
bean
package com.zqh.service;
public class UserServiceImpl implements UserService {
private String name;
/*public UserServiceImpl(String name) {
this.name = name;
}*/
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("save"+name);
}
}
xml配置
<bean id="userService" class="com.zqh.service.UserServiceImpl">
<!--set方法的属性注入-->
<!--
name:参数名称
value:参数值
ref:参数引用可以是另一个spring容器中的bean
-->
<property name="name" value="张"></property>
</bean>
3、P名称空间注入
p:<属性名>=“xxx” 引入常量值
p:<属性名>-ref=“xxx” 引用其他bean对象
bean
package com.zqh.service;
public class UserServiceImpl implements UserService {
private String name;
/*public UserServiceImpl(String name) {
this.name = name;
}*/
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("save"+name);
}
}
在xml约束中添加xmlns:p=“http://www.springframework.org/schema/p”
<bean id="userService" class="com.zqh.service.UserServiceImpl" p:name="张"/>
4、SpEL注入
SpEL:spring expression language,spring表达式语言,对依赖注入进行简化
语法:#{表达式}
#{‘hello’}:使用字符串常量
#{userBean}:使用另一个bean
#{userBean.name.toUpperCase}:使用指定属性,并使用方法
#{T(java.lang.Math).PI}:使用静态字段或方法
bean
package com.zqh.service;
public class UserServiceImpl implements UserService {
private String name;
/*public UserServiceImpl(String name) {
this.name = name;
}*/
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("save"+name);
}
}
xml
<!--<bean id="userService" class="com.zqh.service.UserServiceImpl" p:name="#{'张'}"/>-->
<bean id="userService" class="com.zqh.service.UserServiceImpl" >
<property name="name" value="#{'张'}"></property>
</bean>
5、复杂属性注入
bean
public class CollectionBean {
private String[] arrs; // 数组类型
private List<String> list;// List集合类型
private Set<String> set; // Set集合类型
private Map<String,Integer> map;// Map集合类型
private Properties properties; // 属性类型
public String[] getArrs() {
return arrs;
}
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
public Map<String, Integer> getMap() {
return map;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "CollectionBean{" +
"arrs=" + Arrays.toString(arrs) +
", list=" + list +
", set=" + set +
", map=" + map +
", properties=" + properties +
'}';
}
}
xml
<!--集合类型的属性注入=================================-->
<bean id="collectionBean" class="com.bean.CollectionBean">
<!--数组类型-->
<property name="arrs">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<!--List集合的属性注入-->
<property name="list">
<list>
<value>111</value>
<value>222</value>
<value>333</value>
</list>
</property>
<!--Set集合的属性注入-->
<property name="set">
<set>
<value>ddd</value>
<value>eee</value>
<value>fff</value>
</set>
</property>
<!--Map集合的属性注入-->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
<!--Properties的属性注入-->
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">1234</prop>
</props>
</property>
</bean>
二、注解方式的属性注入
1、普通属性类型
bean属性注解配置
@Value("张")
private String name;
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置注解扫描-->
<context:component-scan base-package="com.zqh"/>
<bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>
<bean id="userController" class="com.zqh.controller.UserController"></bean>
</beans>
2、其他类型
bean中注入另一个bean类型
1、@Autowired
默认按照属性类型进行注入,如果存在两个相同的bean类型属性,则需要按照bean的名称注入,使用@Qualifier和Autowired配置,Qualifier指定将哪个bean注入进来。
@Autowired
private UserDao userDao;
xml
<context:component-scan base-package="com.zqh"/>
<bean id="userDao" class="com.zqh.dao.UserDao"></bean>
<bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>
2、@Autowired和@Qualifier
指定注入bean的名称
使用Qualifier指定bean名称后,注解或者xml配置的bean中必须指定相同的名称
@Autowired
@Qualifier(value = "userDao")
private UserDao userDao;
xml
<context:component-scan base-package="com.zqh"/>
<bean id="userDao" class="com.zqh.dao.UserDao"></bean>
<bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>
3、@Resource
和@Autowired功能相似
@Resource是jdk的,@Autowired是spring提供的
需要指定bean的名称
@Resource(name = "userDao")
private UserDao userDao;
xml
<context:component-scan base-package="com.zqh"/>
<bean id="userDao" class="com.zqh.dao.UserDao"></bean>
<bean id="userService" class="com.zqh.service.UserServiceImpl"></bean>