您的位置:首页 > 编程语言 > Java开发

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";
}
}


注解与配置比较:
注解,简化配置,开发快捷高效!
配置,开发繁琐、配置麻烦,容易维护!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: