Spring学习总结 —— IoC/DI

Spring学习总结 —— IoC/DI

IoC:控制反转又称依赖注入(DI),其作用是降依类与类之间的耦合

IoC实现的几种方式
  1. 属性注入 : 通过setter方法给属性设值
    ① 创建bean类 并 声明 bean

    //省去 bean类创建

    //定义一个名 为 userDao的bean

    <bean name="userDao" class="cn.jbit.demo.dao.impl.UserDaoImpl" />

    注意: 用这种方式必须要给出无参数构造
    在需要注入的类中定义 属性 并至少 给出 setter方法

    public class UserBizImpl implements IUserBiz(){
    // 注入属性
    private IUserDao userDao;

    // 注入属性 的 setter

    public void setUserDao(IUserDao userDao){

    this.userDao=userDao;

    }
    // 方法略
    }


    ③在xml中进行注入 

    //方式一 用<property /> 将 userDao注入到 userBiz

    <bean name="userBiz" class="cn.jbit.demo.biz.impl.UserBizImpl">

    <property name="userDao" ref="userDao" />

    </bean>

    //方式二 用p命名空间方式 将 userDao 注入到 userBiz

    <bean name="userBiz" class="cn.jbit.demo.biz.impl.UserBizImpl" p:userDao-ref="userDao" />


  2. 构造注入 : 通过带参构造方法给属性设值
    ①创建要注入的bean类 , 并在配置文件中声明bean对象

    //省去类的创建

    //声明一个userDao bean对象

    <bean name="userDao" class="cn.jbit.demo.dao.impl.UserDaoImpl" />


    ②创建要被注入的类 并给出 所需的 构造器

    public class UserBizImpl implements IUserBiz(){
    // 注入属性
    private IUserDao userDao;
    // 注入属性 的 构造方法
    public UserBizImpl(IUserDao userDao){
    this.userDao=userDao
    }

    // 方法略
    }


    ③在配置文件中进行注入

    <bean name="userBiz" class="cn.jbit.demo.biz.impl.UserBizImpl" />

    <constructor-arg> <!-- 注入userDao -->
    <ref bean="userDao" />
    </constructor-arg>

    <!-- 如果有多个参数 用 <constructor-arg index="1" value="8" />  index:参数位置 value:值类型 , ref:引及型 -->

    </bean>


  3. 反射注入 : 通过反射的方式给属性设值

    ① 声明Bean : Spring的IoC组件

    @Repository:持久层组件,用于标注数据访问层组件,如DAO层组件。
    @Service:服务成组件,用于标注业务层组件,如Service层组件;会根据Bean的类型实例化一个首字母为小写的bean的实例,如果要修改bean name可以在@Service("custome beanName")。
    @Controller:用于标注控制层主键,如Strust的Action层组件。
    @Component:泛指组件,当组件不好归类的时候可以用这个标注。

    // 定义一个名为userDao的bean

    @Component("userDao")

    public class UserDao implements IUserDao(){

    // 方法 略

    }

    ② 装配 : 通过注解的方式对Bean的自动注入

    @Autowired :是通过"byType"的方式对Bean属性进行自动注入的,如果Bean属性的类型有多个,那么就添加 @Qualifier("beanName") 加以区分。

    //声明一个 名为 userBizImpl的 bean

    @Service

    public class UserBizImpl implements IUserBiz(){

    // 注入名为 userDao 的bean

    @Autowired

    @Qualifier("userDao")

    private IUserDao userDao;

    // 方法略

    }

    @Resource:是通过"byType"的方式对Bean属性进行自动注入的,如果Bean属性的类型有多个,那么就用@Resource("beanName") , @Resource("beanName") 是通过"byName"的方式对Bean属性进行自动注入的。

    //声明一个 名为 userBiz的 bean
    @Service
    public class UserBiz implements IUserBiz(){
    // 注入类型为 IUserDao 的bean
    @Resource
    private IUserDao userDao;

    //注入name 为 userName 的bean;

    @Resource("userName")

    private IUserDao userDao1;
    // 方法略
    }

  4. 接口注入 : 在spring中被废弃,ejb中有用
Spring 对Bean的四种自动装配(注入)方式
  1. autowire= "byName" :通过Bean的名字对属性进行值注入
  2. autowire="byType":通过属性的类型来对属性进行值注入。<慎用>
  3. autowire="constructor":通过构造器来对属性进行值注入。<慎用>
  4. autowire="autodetect":容器自动对属性进行值注入,先用constructor的方式,如果没有构造器,再用byType的方式。<尽量不用>

Spring Bean的应用范围

scope="singleton":单例(默认),对所有应用都只生成一个实例
scope="prototype":对每个应用都生成一个实例
scope="request":在web应用中有效,对每个请求都生成一个实例
scope="session":在web应用中有效,对每个会话 都生成一个实例
scope="global-session":在web应用中有效,全局Http会话
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值