七 依赖注入
1 常量注入
User类
package com.rl.spring.model;
public class User {
private Integer userId;
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
System.out.println("user被创建");
}
public void init(){
System.out.println("我出来了");
}
public void destroy(){
System.out.println("20年后又是一条好汉");
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User [userId=" + userId + ", username=" + username + ", password=" + password + "]";
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="user" class="com.rl.spring.model.User">
<property name="userId" value="1"></property>
<property name="username" value="lijialin"></property>
<property name="password" value="123"></property>
</bean>
</beans>
测试类:
package com.rl.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rl.spring.model.User;
public class TestSpring {
@Test
public void test() {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("ApplicationContext.xml");
User user = (User) ctx.getBean("user");
System.out.println(user);
}
}
测试输出:
User [userId=1, username=lijialin, password=123]
2 构造器注入
注入常量
User类: 在该类中添加有参构造器, 同时需要添加无参构造器
package com.rl.spring.model;
public class User {
private Integer userId;
private String username;
private String password;
public User() {
}
public User(Integer userId, String username, String password) {
super();
this.userId = userId;
this.username = username;
this.password = password;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void init(){
System.out.println("我出来了");
}
public void destroy(){
System.out.println("20年后又是一条好汉");
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User [userId=" + userId + ", username=" + username + ", password=" + password + "]";
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="user" class="com.rl.spring.model.User">
<!--
index是指构造方法中的参数的索引, 从0开始
value是值
-->
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="lijialin"/>
<constructor-arg index="2" value="123"/>
</bean>
</beans>
测试输出:
User [userId=1, username=lijialin, password=123]
注入变量
UserServiceImpl类:
需要在UserServiceImpl类中提供有参和无参的构造方法
package com.rl.spring.service.impl;
import com.rl.spring.dao.UserDao;
import com.rl.spring.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl() {
}
public UserServiceImpl(UserDao userDao) {
super();
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="userDao" class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
<!--
index: 参数只有一个UserDao 索引为0
type: UserDao的包路径(需要是接口的包路径)
ref: 引入的userDao的bean的id
-->
<bean id="userService" class="com.rl.spring.service.impl.UserServiceImpl">
<constructor-arg index="0" type="com.rl.spring.dao.UserDao" ref="userDao" />
</bean>
</beans>
测试代码:
package com.rl.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rl.spring.service.UserService;
public class TestSpring {
@Test
public void test() {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("ApplicationContext2.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.save();
}
}
输出:
user被保存了
3 外部bean注入(最常用的注入方式)
外部bean的注入方式必须在UserServiceImpl类中提供set...方法
UserServiceImpl类:
package com.rl.spring.service.impl;
import com.rl.spring.dao.UserDao;
import com.rl.spring.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="userDao" class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
<!--
name: UserServiceImpl类中的userDao属性
ref: 引入上面userDao这个bean
-->
<bean id="userService" class="com.rl.spring.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
测试代码跟输出结果同上
4 内部bean注入(较少使用)
UserServiceImpl类跟同上需要set方法
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- 内部bean的注入形式
缺点是无法再给其他bean引用
-->
<bean id="userService" class="com.rl.spring.service.impl.UserServiceImpl">
<property name="userDao">
<bean class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
</property>
</bean>
</beans>
测试代码和输出同上
5 集合注入
集合注入能够注入 set list map property
创建一个新的类CollectionInjection
package com.rl.spring.model;
import java.util.Set;
public class CollectionInjection {
private Set<String> set;
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="ci" class="com.rl.spring.model.CollectionInjection">
<!-- 属性set -->
<property name="set">
<set>
<!-- 给集合赋值 -->
<value>football</value>
<value>basketball</value>
</set>
</property>
</bean>
</beans>
测试代码:
package com.rl.spring.test;
import java.util.Set;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rl.spring.model.CollectionInjection;
import com.rl.spring.service.UserService;
public class TestSpring {
@Test
public void test() {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("ApplicationContext5.xml");
CollectionInjection ci = (CollectionInjection) ctx.getBean("ci");
Set<String> set = ci.getSet();
System.out.println(set);
}
}
输出结果:
[football, basketball]
list集合跟set集合相同
map集合跟list跟set集合的用法类似, 区别在于配置文件有些许不同
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="ci" class="com.rl.spring.model.CollectionInjection">
<!-- 属性set -->
<property name="set">
<set>
<!-- 给集合赋值 -->
<value>football</value>
<value>basketball</value>
</set>
</property>
<property name="map">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key2" value="value2"></entry>
</map>
</property>
</bean>
</beans>
测试代码也跟set和list类似
输出:
{key1=value1, key2=value2}
Properties
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="ci" class="com.rl.spring.model.CollectionInjection">
<!-- 属性set -->
<property name="set">
<set>
<!-- 给集合赋值 -->
<value>football</value>
<value>basketball</value>
</set>
</property>
<property name="map">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key2" value="value2"></entry>
</map>
</property>
<property name="prop">
<props>
<prop key="name">lijialin</prop>
<prop key="job">讲师</prop>
</props>
</property>
</bean>
</beans>
测试代码:
package com.rl.spring.test;
import java.util.Map;
import java.util.Properties;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rl.spring.model.CollectionInjection;
public class TestSpring {
@Test
public void test() {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("ApplicationContext5.xml");
CollectionInjection ci = (CollectionInjection) ctx.getBean("ci");
// Set<String> set = ci.getSet();
// Map<String, String> map = ci.getMap();
Properties prop = ci.getProp();
System.out.println(prop);
}
}
输出结果:
{name=lijialin, job=讲师}