一,概述
Spring中给对象的属性赋值的几种方式:
1)通过构造函数(在上一篇博客Spring之IOC容器有介绍)
2)通过set方法给属性注入值
3)p名称空间
4)自动装配(了解)
5)注解(方便,但比较难维护)
二,准备工作
1)UserDao.java
package com.bighuan.c_property;
public class UserDao {
public void save(){
System.out.println("DB:保存用户");
}
}
2)UserService.java
package com.bighuan.c_property;
public class UserService {
private UserDao userDao;//=new UserDao();
//IOC:对象的创建交给spring的外部容器创建
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save(){
userDao.save();
}
}
3)User.java
package com.bighuan.c_property;
public class User {
public User(){
System.out.println("------创建user对象[无参构造器]----");
}
public User(int id, String name) {
System.out.println("------创建user对象[有参构造器]----");
this.id = id;
this.name = name;
}
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void init_user(){
System.out.println("在创建user对象后初始化");
}
public void destroy_user(){
System.out.println("IOC容器销毁,user对象回收");
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
4)UserAction.java
package com.bighuan.c_property;
public class UserAction {
// service:springIOC容器注入
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public String execute() {
userService.save();
return null;
}
}
三,Spring之对象属性赋值
1)通过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"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!-- IOC容器的配置:要创建的所有对象都在这里配置 -->
<!-- *****对象属性赋值 ***** -->
<!-- 1,通过构造函数 -->
<bean id="user1" class="com.bighuan.c_property.User">
<constructor-arg value="11" index="0" type="int"></constructor-arg>
<constructor-arg value="bighuan" index="1"
type="java.lang.String"></constructor-arg>
</bean>
<!-- 2,通过set方法给属性注入值 -->
<bean id="user" class="com.bighuan.c_property.User">
<property name="id" value="18"></property>
<property name="name" value="张国荣"></property>
</bean>
<!-- 案例:dao/service/action -->
<!-- dao instance -->
<bean id="userDao" class="com.bighuan.c_property.UserDao">
</bean>
<!-- service instance -->
<bean id="userService" class="com.bighuan.c_property.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- action instance -->
<bean id="userAction" class="com.bighuan.c_property.UserAction">
<property name="userService" ref="userService"></property>
</bean>
</beans>
执行测试代码:
@Test
public void testExecAction() throws Exception {
ApplicationContext ac1 = new ClassPathXmlApplicationContext(
"com/bighuan/c_property/bean.xml");
UserAction action=(UserAction) ac1.getBean("userAction");
action.execute();
}
控制台输出:
DB:保存用户,所以通过set方法注入值成功了,最终执行了UserDao的save方法.
此外,还可以通过内部bean的方式注入值:
<!-- ********内部bean******** -->
<bean id="userAction2" class="com.bighuan.c_property.UserAction">
<property name="userService">
<bean class="com.bighuan.c_property.UserService">
<property name="userDao">
<bean class="com.bighuan.c_property.UserDao"></bean>
</property>
</bean>
</property>
</bean>
通过测试,最终结果是一样的.
2)p名称空间注入属性值
<?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:p="http://www.springframework.org/schema/p"
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">
<!-- IOC容器的配置:要创建的所有对象都在这里配置 -->
<!-- *****对象属性赋值 ***** -->
<!--
给对象的属性注入值
# p 名称空间给对象的属性注入值
(一般spring3.0以上版本才支持)
-->
<bean id="userDao" class="com.bighuan.c_property.UserDao"></bean>
<bean id="userService" class="com.bighuan.c_property.UserService" p:userDao-ref="userDao"></bean>
<bean id="userAction" class="com.bighuan.c_property.UserAction" p:userService-ref="userService"></bean>
<!-- p名称空间优化后 -->
<bean id="user" class="com.bighuan.c_property.User" p:name="rose"></bean>
</beans>
执行测试代码:
@Test
public void testExecAction() throws Exception {
UserAction action=(UserAction) ac.getBean("userAction");
action.execute();
System.out.println(ac.getBean("user"));
}
输出结果:
------创建user对象[无参构造器]----
DB:保存用户
User [id=0, name=rose]
这种方式给属性赋值相较于上面那种方式更为简单了;使用的时候,一定要声明才能用!
xmlns:p="http://www.springframework.org/schema/p"
3),自动装配(了解)
<?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:p="http://www.springframework.org/schema/p"
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"
default-autowire="byName">
<!-- IOC容器的配置:要创建的所有对象都在这里配置 -->
<!-- *****自动装配***** -->
<!-- 自动装配可以定义到全局: default-autowire="byName",这样就可以不用每个节点都定义:autowire="byName" -->
<bean id="userDao111" class="com.bighuan.d_auto.UserDao"></bean>
<!-- <bean id="userService" class="com.bighuan.d_auto.UserService"></bean> -->
<!--<bean id="userAction" class="com.bighuan.d_auto.UserAction"></bean> -->
<bean id="userService222" class="com.bighuan.d_auto.UserService"
autowire="byType"></bean>
<!-- 根据"名称"自动装配 ,UserAction注入的属性,会去IOC容器中自动查找与属性同名的对象 -->
<bean id="userAction" class="com.bighuan.d_auto.UserAction"
autowire="byType"></bean>
<!-- 如果根据类型自动装配: 必须确保IOC容器中只有一个该类型的对象 -->
<!-- 报错: 因为上面已经有一个该类型的对象,且使用了根据类型自动装配
<bean id="userService_test" class="com.bighuan.d_auto.UserService"
autowire="byType"></bean>-->
</beans>
说明都在代码注释里了.
4)注解
a)必须要引入context名称空间:xmlns:context="http://www.springframework.org/schema/context"
<?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:p="http://www.springframework.org/schema/p"
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.bighuan.e_anno"></context:component-scan>
</beans>
b)UserDao.java
package com.bighuan.e_anno;
import org.springframework.stereotype.Component;
//把当前对象加入IOC容器
@Component("userDao")//<bean id="userDao" class="com.bighuan.d_auto.UserDao"></bean>
public class UserDao {
public void save(){
System.out.println("DB:保存用户");
}
}
c)UserService.java
package com.bighuan.e_anno;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
//将UserService加入IOC容器
@Component("userService")
public class UserService {
@Resource(name = "userDao")
private UserDao userDao;// =new UserDao();
// IOC:对象的创建交给spring的外部容器创建
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
d)UserAction.java
package com.bighuan.e_anno;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component("userAction")//将userAction加入IOC容器
public class UserAction {
// service:springIOC容器注入
@Resource(name="userService")
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public String execute() {
userService.save();
return null;
}
}
e)测试
@Test
public void testExecAction() throws Exception {
UserAction action=(UserAction) ac.getBean("userAction");
action.execute();
}
结果与上面那两种方式一样.
其实注解还可以更简单.
UserDao.java
package com.bighuan.e_anno2;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
//把当前对象加入IOC容器
//<bean id="userDao" class="com.bighuan.d_auto.UserDao"></bean>
//加入IOC容器的UserDao对象的引用名称,默认与类名一样,只是首字母小写
//@Component //不能区分哪一个层次的数据
@Repository//表示这是持久层
public class UserDao {
public void save(){
System.out.println("DB:保存用户");
}
}
UserService.java
package com.bighuan.e_anno2;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
//将UserService加入IOC容器
//@Component
@Service
// 代表业务逻辑层的组件
public class UserService {
// @Resource(name="userDao")//根据名称查找
@Resource
private UserDao userDao11;// 去容器中找UserDao类型的变量,找到后就赋值,与名字无关
public void save() {
userDao11.save();
}
}
UserAction.java
package com.bighuan.e_anno2;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
//@Component
@Controller //控制层的组件
public class UserAction {
// service:springIOC容器注入
@Resource
private UserService userService;
public String execute() {
userService.save();
return null;
}
}
创建对象以及处理对象依赖关系,相关的注解:
@Component 指定把一个对象加入IOC容器
@Repository 作用同@Component; 在持久层使用
@Service 作用同@Component; 在业务逻辑层使用
@Controller 作用同@Component; 在控制层使用
@Resource 属性注入
总结:
使用注解,可以简化配置,且可以把对象加入IOC容器,及处理依赖关系(DI).
注解可以和XML配置一起使用.
四,总结
不想写了,好烦!