对象依赖关系
Spring中,如何给对象的属性赋值? 【DI, 依赖注入】
1) 通过构造函数
2) 通过set方法给属性注入值
3) p名称空间
4)自动装配(了解)
5) 注解
一、对象属性赋值,通过构造函数
user
1 public class User { 2 3 private String userId; 4 private String username; 5 6 public User() { 7 System.out.println("======不带参构造器========="); 8 } 9 10 public User(String userId, String username) { 11 System.out.println("======带参构造器========="); 12 this.userId = userId; 13 this.username = username; 14 } 15 16 public String getUserId() { 17 return userId; 18 } 19 20 public void setUserId(String userId) { 21 this.userId = userId; 22 } 23 24 public String getUsername() { 25 return username; 26 } 27 28 public void setUsername(String username) { 29 this.username = username; 30 } 31 32 @Override 33 public String toString() { 34 return "User [userId=" + userId + ", username=" + username + "]"; 35 } 36 37 }
bean.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd"> 10 11 12 <!-- 对象属性赋值 通过构造函数 --> 13 <bean id="user" class="com.liuyang.demo.property.User"> 14 <constructor-arg index="0" value="100"></constructor-arg> 15 <constructor-arg index="1" value="小白兔"></constructor-arg> 16 </bean> 17 </beans>
测试
1 public class App { 2 3 ApplicationContext aContext = new ClassPathXmlApplicationContext( 4 "com/liuyang/demo/property/beans2.xml"); 5 6 @Test 7 public void test() { 8 User user = (User) aContext.getBean("user1"); 9 10 System.out.println(user); 11 } 12 }
二、通过set方法给属性注入值
更改bean,其他不变
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd"> 10 <!-- set方法赋值 --> 11 <bean id="user1" class="com.liuyang.demo.property.User"> 12 <property name="userId" value="101"></property> 13 <property name="username" value="大虎猫"></property> 14 </bean> 15 16 </beans>
事例一个set方法传值案例:
创建userdao
1 public class UserDAO { 2 3 public void saveUser() { 4 System.out 5 .println("保存成功**********************************************"); 6 7 } 8 9 }
创建servicedao
1 public class UserService { 2 private UserDAO dao; 3 4 public void setDao(UserDAO dao) { 5 this.dao = dao; 6 } 7 8 public void save() { 9 dao.saveUser(); 10 } 11 12 }
创建action
1 public class UserAction { 2 3 private UserService us; 4 5 public void setUs(UserService us) { 6 this.us = us; 7 } 8 9 public String execute() { 10 us.save(); 11 return null; 12 } 13 14 }
bean.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd"> 10 11 12 <!-- 对象属性赋值 通过构造函数 --> 13 <bean id="user" class="com.liuyang.test.DI.User"> 14 </bean> 15 <!-- dao注入 --> 16 <bean id="dao" class="com.liuyang.test.DI.UserDAO"> 17 </bean> 18 19 <!-- service注入 --> 20 <bean id="us" class="com.liuyang.test.DI.UserService"> 21 <property name="dao" ref="dao"></property> 22 </bean> 23 24 <!-- action注入 --> 25 <bean id="userAction" class="com.liuyang.test.DI.UserAction"> 26 <property name="us" ref="us"></property> 27 </bean>
测试
1 public class App { 2 3 ApplicationContext aContext = new ClassPathXmlApplicationContext( 4 "com/liuyang/test/DI/beans2.xml"); 5 6 @Test 7 public void test() { 8 UserAction userAction = (UserAction) aContext.getBean("userAction"); 9 10 userAction.execute(); 11 } 12 }
还有内部的bean写法如图,适用于只有一个dao和一个service的情况
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd"> 10 <!-- 内部调用 dao和service在容器中只用一次,缺点不易维护--> 11 <bean id="userAction1" class="com.liuyang.test.DI.UserAction"> 12 <property name="us"> 13 <bean class="com.liuyang.test.DI.UserService"> 14 <property name="dao"> 15 <bean class="com.liuyang.test.DI.UserDAO"></bean> 16 </property> 17 </bean> 18 </property> 19 </bean> 20 </beans>
三、p名称空间的使用
(1)p引用的使用
保证约束条件有xmlns:p="http://www.springframework.org/schema/p"
更改bean.xml
1 <!-- 2 给对象属性注入值: 3 # p 名称空间给对象的属性注入值 4 (spring3.0以上版本才支持) 5 --> 6 <?xml version="1.0" encoding="UTF-8"?> 7 <beans xmlns="http://www.springframework.org/schema/beans" 8 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 9 xmlns:context="http://www.springframework.org/schema/context" 10 xsi:schemaLocation=" 11 http://www.springframework.org/schema/beans 12 http://www.springframework.org/schema/beans/spring-beans.xsd 13 http://www.springframework.org/schema/context 14 http://www.springframework.org/schema/context/spring-context.xsd"> 15 <bean id="user" class="com.liuyang.test.DI.User"> 16 </bean> 17 <bean id="dao" class="com.liuyang.test.DI.UserDAO"></bean> 18 <bean id="us" class="com.liuyang.test.DI.UserService" p:dao-ref="dao"></bean> 19 <bean id="userAction" class="com.liuyang.test.DI.UserAction" 20 p:us-ref="us"></bean> 21 </beans>
(2)p传值的引用
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd"> 10 <bean id="meinv" class="com.liuyang.test.DI.User" p:username="小白兔"></bean> 11 </beans>
p命名空间是一种优化