Spring 构造方法注入学习心得
Spring提供setter方法和构造方法两种方式的注入,大多时候我们使用setter方式注入来解决问题。
但是当我们遇到别人写的包只能用构造方法注入时就无法避免使用构造注入。
Spring构造注入基本写法如下
//选写一个简单的接口 public interface UserDao { void save(); } //接口实现如下 public class UserDaoImpl implements UserDao { //添加一个成员属性 private String userName; //用构造方法写入 public UserDaoImpl2(String userName) { this.userName = userName; } //简单的实现一个接口,并输出userName属性用于测试是否成功注入 @Override public void save() { System.out.println("save " + userName); } }
写一个main方式进行测试,代码如下:
public class app { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userdao =(UserDao) ctx.getBean("userDao"); userdao.save(); } }
编写applicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--构造方式注入--> <bean id="userDao" class="com.hyq.springStudy.dao.impl.UserDaoImpl2"> <!--基本类型使用value注入--> <constructor-arg name="userName" value="hyq2" /> <!--引用类型使用ref 传入bean的id--> <!--<constructor-arg name="userName" ref="bean id" /> --> </bean> </beans>
运行后结果是save hyq2结果符合我们预期
解耦方式进行注入
以上注入是使用构造方法中形参的名字做为参数,这样形成紧耦合,当参数名变了我们也得改这不符合spring解耦的思想,于是提出以下2种配置方式
1.类型方式注入
<?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.xsd"> <!--构造方式注入--> <bean id="userDao" class="com.hyq.springStudy.dao.impl.UserDaoImpl"> <!--如果参数中有多个String类型,这里就配置多个String类型的注入,注入顺序为形参声明顺序 比如:我们的构造函数变成这样 public UserDaoImpl2(String userName,String userName2) 按下边配置: 把"hyq2"给userName 把"user2"username2 --> <constructor-arg type="String" value="hyq2" /> <!-- 这句用于说明上边多个同类型参数注入用 --> <!-- <constructor-arg type="String" value="user2" /> --> </bean> </beans>
2.按声明顺序注入
<?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.xsd"> <!--构造方式注入--> <bean id="userDao" class="com.hyq.springStudy.dao.impl.UserDaoImpl"> <!--从0开始计算形参位置 --> <constructor-arg index= value="hyq2" /> </bean> </beans>