使用setter注入、
在bean中定义引用类型属性并提供可访问的set方法
(第一期spring举例过,此处实例省略dao层和接口)
public class UserServiceImpl implements UserDao {
@Setter
private UserDao userDao;
//一个方法
public int addNewUser(User user) {
return userDao.addNewUser(user);
}
}
在配置文件中使用property标签注入ref属性引用类型对象
<bean id="userDao" class="com.jules.dao.impl.UserDaoImpl">bean>
<bean id="userService" class="com.jules.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
bean>
【如果不止一个引用类型,多个private UserDao userDao;,只需要在配置处配置bean,并添加
使用setter注入、
一个HelloWorld类中写一个String类型对象,提供可访问的set方法
public class HelloWorld {
@Setter
private String message;
public void show(){
System.out.println("打印的信息"+message);
}
}
配置:使用property
标签、value
属性注入值
<bean id="helloWorld" class="com.hz.test.HelloWorld">
<property name="message" value="辣椒面撒多了的烤串"/>
bean>
测试
public class main01 {
public static void main(String[] args) {
//使用ClassPathXmlApplicationContext读取配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//使用getBean("bean中ID属性值")获取对象
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
helloWorld.show();
}
}
//控制台打印:辣椒面撒多了的烤串
使用构造器注入、
示例准备:
//dao接口
public interface UserDao {
public int addNewUser(User user);
}
//dao实现
public class UserDaoImpl implements UserDao {
public int addNewUser(User user) {
System.out.println("新添加一个对象~~~");
return 0;
}
}
//service接口:
public interface UserService {
public int addNewUser(User user);
}
在bean中定义引用类型属性并提供可访问的构造
方法
//service实现
//@AllArgsConstructor //有参构造函数
@NoArgsConstructor //无参构造函数
public class UserServiceImpl implements UserService {
private UserDao userDao;
//有参构造,上面注解的形式或者↓
public UserServiceImpl(UserDao userDao1111) {
this.userDao = userDao;
}
public int addNewUser(User user) {
return userDao.addNewUser(user);
}
}
配置中使用constructor-arg
标签ref属性
<bean id="userDao" class="com.jules.dao.impl.UserDaoImpl">bean>
<bean id="userService" class="com.jules.service.impl.UserServiceImpl">
//注意代码:这样写name中的值与构造方法的形参"userDao1111"对应,名称耦合
//<constructor-arg name="userDao1111" ref="userDao" />
<constructor-arg>
<ref bean="userDao">ref>
constructor-arg>
bean>
一个String类型、一个int类型,并提供可访问的构造
方法
public class HelloWorld {
private String message;
private int num;
public HelloWorld (String message, int num) {
this.message = message;
this.num = num;
}
public void show(){
System.out.println("打印的信息"+message+"----"+num+"条");
}
}
配置:使用constructor-arg
标签、value
属性注入值
<bean id="helloWorld" class="com.hz.test.HelloWorld">
<constructor-arg name="message" value="辣椒面撒多了的烤串"/>
<constructor-arg name="num" value="10"/>
bean>
<bean id="helloWorld" class="com.hz.test.HelloWorld">
<constructor-arg type="java.lang.Sring" value="辣椒面撒多了的烤串"/>
<constructor-arg type="int" value="10"/>
bean>
<bean id="helloWorld" class="com.hz.test.HelloWorld">
<constructor-arg index="0" value="辣椒面撒多了的烤串"/>
<constructor-arg index="1" value="10"/>
bean>
【===========================三种形式有利有弊选择使用========================】
- 1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
- 2.可选依赖使用setter注入进行,灵活性强
- Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
- 4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
- 5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入
类型匹配必须唯一
//service实现
public class UserServiceImpl implements UserDao {
private UserDao userDao;
//ser方法必须有
public void ;setUserDao(UserDao userDao) {
this,userDao = userDao
}
//一个方法
public void save() {
System.out.println("user service save……");
userDao.save();
}
}
<bean id="userDao" class="com.jules.dao.impl.UserDaoImpl">bean>
//按类型自动装配
<bean id="userService" class="com.jules.service.impl.UserServiceImpl" autowire="byType"/>
注意:
- 按类型装配,没有对应的注入,报错:
- 多个bean的注入:com.jules.dao.impl.UserDaoImpl对应的bean不唯一
//service实现
public class UserServiceImpl implements UserDao {
private UserDao userDao;
//ser方法必须有
public void setUserDao(UserDao userDao) {
this,userDao = userDao
}
//一个方法
public void save() {
System.out.println("user service save……");
userDao.save();
}
}
//此时id与private UserDao userDao相对应
<bean id="userDao" class="com.jules.dao.impl.UserDaoImpl">bean>
<bean id="userDao2" class="com.jules.dao.impl.UserDaoImpl">bean>
//按名称自动装配
<bean id="userService" class="com.jules.service.impl.UserServiceImpl" autowire="byName"/>
【注意:倘若同一个引用使用不同的bean,只会匹配拥有的bean;一般都只会对应一个实现类,< bean >中的id可以省略】
对于直接量(基本数据类型、字符串)属性:p:属性名=“属性值”
对于引用Bean的属性:p:属性名-ref="Bean的id"
xmlns:p="http://www.springframework.org/schema/p"
<bean id="zhangGaSay" class="service.Person" p:who="张嘎"
p:say="三天不打小鬼子,手都痒痒!" />
<bean id="RodSay" class="service.Person" p:who="Rod"
p:say="世界上有10种人,认识二进制的和不认识二进制的。" />
<bean id="userDao" class="dao.impl.UserDaoImpl" />
<bean id="userService" class="service.impl.UserServiceImpl"
p:dao-ref="userDao"/>
//dao接口
public interface UserDao {
public int addNewUser(User user);
}
//daos实现
public class UserDaoImpl implements UserDao {
public int addNewUser(User user) {
System.out.println("新添加一个对象~~~"+user.getUserName());
return 0;
}
}
//service接口
public interface UserService {
public int addNewUser(User user);
}
//service实现
public class UserServiceImpl implements UserService {
//set方法
@Setter
private UserDao userDao;
@Setter
private String uname;
@Setter
private String ucode;
public int addNewUser(User user) {
user.setUserName(uname);
user.setUserCode(ucode);
return userDao.addNewUser(user);
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.jules.dao.impl.UserDaoImpl">bean>
<bean id="userService" class="com.jules.service.impl.UserServiceImpl"
p:uname="张三"
p:ucode="1001"
p:userDao-ref="userDao">
bean>
beans>
public class UserServiceImplTest {
@Test
public void addNewUser() {
//使用ClassPathXmlApplicationContext读取配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//使用getBean("bean中ID属性值")获取对象
UserService userService = (UserService) context.getBean("userService");
userService.addNewUser(new User());
}
}
//控制台输出:新添加一个对象~~~张三
直接放代码
@Setter
public class EntityTest {
private List<String> list; // List类型
private String[] array; // 数组类型
private Set<String> set; // Set类型
private Map<String, String> map; // Map类型
private Properties props; // Properties类型
}
<bean id="entityTest" class="com.jules.entity.EntityTest">
<property name="list">
<list>
<value>注入value>
<value>Listvalue>
<value>类型value>
list>
property>
<property name="array">
<list>
<value>注入value>
<value>Array数组value>
<value>类型value>
list>
property>
<property name="set">
<set>
<value>Julesvalue>
<value>朱尔斯value>
set>
property>
<property name="map">
<map>
<entry>
<key><value>5555value>key>
<value>朱尔斯value>
entry>
<entry>
<key><value>6666value>key>
<value>Julesvalue>
entry>
map>
property>
<property name="props">
<props>
<prop key="url">lochost:xxxx/xx/x/xprop>
<prop key="driver">aaaaaprop>
<prop key="username">rootprop>
<prop key="password">rootprop>
props>
property>
bean>