Spring学习——DI(依赖注入)
2015-06-14 23:16
323 查看
IOC容器,处理对象依赖关系
IOC与DI:
IOC :是一个容器,创建对象的容器
DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入!
方式1:通过set方法注入值
可以给普通属性、集合属性注入值:1. 必须提供set方法
2. 配置中通过bean的property子节点,给对象属性注入值;
<!-- 依赖注入,即处理对象的依赖关系!给对象的属性设置值! --> <!-- 1) 给对象属性赋值(通过构造函数)--> <bean id="user1" class="cn.andy.d_di.User"> <constructor-arg index="0" value="1000"></constructor-arg> <constructor-arg index="1" value="Jack"></constructor-arg> </bean> <!-- 2)给对象属性赋值, 通过set方法 --> <bean id="user2" class="cn.andy.d_di.User"> <property name="id" value="100"></property> <property name="name" value="Jacky"></property> </bean> <!-- 通过set方法, 给list集合属性注入值 --> <bean id="user3" class="cn.andy.d_di.User"> <property name="list"> <list> <value>中国</value> <value>美国</value> </list> </property> </bean> <!-- 通过set方法,给map集合注入值 --> <bean id="user4" class="cn.andy.d_di.User"> <property name="map"> <map> <entry key="cn" value="中国"></entry> <entry key="usa" value="美国"></entry> </map> </property> </bean> <!-- 通过set方法,给Properties注入值 --> <bean id="user" class="cn.andy.d_di.User"> <property name="prop"> <props> <prop key="cn">中国</prop> <prop key="usa">美国</prop> </props> </property> </bean>
依赖注入,处理dao/service/action依赖关系:
<!-- 1. 创建dao/service/action对象; 2. 依赖注入 --> <bean id="userdao" class="cn.andy.e_eg.UserDao"></bean> <bean id="userservice" class="cn.andy.e_eg.UserService"> <property name="userDao" ref="userdao"></property> </bean> <bean id="userAction" class="cn.andy.e_eg.UserAction" scope="prototype"> <property name="userService" ref="userservice"></property> </bean>
方式2: 内部bean:
<!-- 适合: 当创建的bean只用一次,可以用内部bean写法 --> <bean id="userAction" class="cn.andy.e_eg2.UserAction"> <property name="userService"> <bean class="cn.andy.e_eg2.UserService"> <property name="userDao"> <bean class="cn.andy.e_eg2.UserDao"></bean> </property> </bean> </property> </bean>
内部bean特点:
1. 写法紧凑
2. 不通用, 内部bean只能被当前的bean使用,别的bean引用不了!
方式3: p名称空间注入值:
<!-- 1. 要先引入p名称空间; 2. spring3.0以上版本才可以 --> <bean id="userdao" class="cn.andy.f_p.UserDao"></bean> <bean id="userService" class="cn.andy.f_p.UserService" p:userDao-ref="userdao"></bean> <bean id="userAction" class="cn.andy.f_p.UserAction" p:userService-ref="userService"></bean>
方式4: 自动装配:
方式4.1: 根据名称自动装配(autowire="byName")会去容器找指定属性名称,注入到对象中(通过set方法注入)
<bean id="userDao" class="cn.andy.g_auto.UserDao"></bean> <bean id="userService" class="cn.andy.g_auto.UserService" autowire="byName"></bean> <bean id="userAction" class="cn.andy.g_auto.UserAction" scope="prototype" autowire="byName"></bean>
方式4.2: 根据类型自动装配(autowire="byType")
1. 当根据类型自动装配,会去容器找改类型的对象,再自动注入
2. 该类型在容器中必须只有一个实例,唯一!
<bean id="userDao1" class="cn.andy.g_auto.UserDao"></bean> <bean id="userservice" class="cn.andy.g_auto.UserService" autowire="byType"></bean> <bean id="userAction" class="cn.andy.g_auto.UserAction" scope="prototype" autowire="byType"></bean>
方式4.3: 全局自动装配(default-autowire="byType"或default-autowire="byName")
定义到根节点,表示所有的bean都使用自动装配:根据名称或类型
<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" default-autowire="byType">
自动装配总结:
1. 写法简单;
2. 不利于维护,出错不好排查!
方式5: 基于注解方式处理对象依赖关系:
注解,可以简化配置!提升开发效率,但是不利于后期维护!@Component 把对象加入ioc容器,对象引用名称是类名,第一个字母小写
@Component(“name”) 把指定名称的对象,加入ioc容器
@Repository, 主要用于标识加入容器的对象是一个持久层的组件(类)
@Service , 主要用于标识加入容器的对象是一个业务逻辑层的组件
@Controller, 主要用于标识加入容器的对象是一个控制层的组件
@Resource 注入属性(DI), 会从容器中找对象注入到@Resource修饰的对象上!
<!-- 步骤: 1. 引入context名称空间 2. 开启注解扫描 3. 使用注解 --> xmlns:context="http://www.springframework.org/schema/context" ... http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> ... <context:component-scan base-package="cn.andy.***"></context:component-scan>
使用注解实例:
//注解实例 @Controller @Scope("prototype") // 指定为多例, 默认为singleton public class UserAction { @Resource // 根据下面属性名称,去容器里面找对应的对象, 找到后注入进来 private IUserService userService; public String execute() { userService.save(); return "success"; } }
注解与配置比较:
注解,简化配置,开发快捷高效!
配置,开发繁琐、配置麻烦,容易维护!
相关文章推荐
- JDK,JRE,JVM区别与联系
- java对象克隆之深度克隆 deep clone
- java 框架基础知识(5)----注解-->Spring配置
- java 基础static关键字
- 在Servlet Filter中使用Spring容器
- Java之CyclicBarrier使用
- spring mvc messageConverters及406等问题
- java链表
- java线程和进程(运用多线程的小球碰撞游戏)
- Java 信号量 Semaphore 介绍
- java实现简单的窗体和密码验证(传参,事件机制和事件监听的作用过程)
- java图形界面基础之画图(使用Graphics类从画图形到图片到gif)
- java的数组队列和泛型
- java jtable mysql 练习与思考
- java的对象克隆技术clone()之浅度克隆(shallow Clone)
- java 框架基础知识(4)----XML基础知识-->Spring配置
- Struts2----带参数转发到JSP
- java学习笔记(六):关于iterator.next()
- Java基础之基础语法
- Java中的日志——Java.util.logging、log4j、commons-logging