Spring之对象依赖关系

xiaoxiao2021-02-27  298

一,概述

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配置一起使用.

四,总结

不想写了,好烦!

转载请注明原文地址: https://www.6miu.com/read-8411.html

最新回复(0)