对spring ioc的理解

理解

Spring框架是一个轻量级的开源框架,是核心容器、数据访问与集成、AOP、Web、消息、测试六个模块的集成,主要是为了简化企业级应用的后台开发,降低耦合性。平时接触到最多的还是IoC和AOP两个特性。IoC指的是控制反转,把对象的创建和依赖关系的维护交给Spring容器去管理。Spring通过工厂模式、反射机制等技术管理对象的作用域和生命周期。AoP一般称为面向切面编程,是面向对象的一种补充,将程序中独立于其他功能的方法抽取出来,使Java开发模块化,仅需专注于主业务即可,其实就是一句话:spring是轻量级的控制反转(IOC)和面向切面(AOP)的框架。

优点

  1. spring是一个开源的、免费的框架(容器)
  2. Spring是一个轻量级、非入侵(引入不会对现有项目产生影响)的框架
  3. 控制反转(IOC)、面向切面编程(AOP)
  4. 支持事务的处理、对框架整合的支持

下载地址

spring

弊端

配置过于繁琐,人称“配置地狱”

IOC理论推导

我们写项目的时候基本上都是三层架构,controller、service、dao、pojo层
daoIMPL实现数据交互

  1. service层
package service;

public interface UserService {
   public  void getData();
}
  1. service实现(主要用于逻辑实现)
package service.impl;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import service.UserService;
public class UserServiceImpl implements UserService {
    public void getData() {
        UserDao userDao=new UserDaoImpl();
        userDao.getData();

    }
}

  1. dao层
package dao;

public interface UserDao {
    public  void getData();
}

  1. dao实现(主要用于数据交互)
package dao.impl;

import dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void getData() {
        System.out.println("连接mysql数据库");
    }
}

  1. 测试类(我这里相当于controller层,接收前台参数,响应数据)
    在这里插入图片描述
    6、假设我们现在需要连接oracle数据库,现在需要写一个oracle实现类
package dao.impl;

import dao.UserDao;

public class OracleImpl implements UserDao {
    public void getData() {
        System.out.println("连接oracle数据库");
    }
}

7、但是如果我们要实现oracle,就必须修改service实现类(逻辑层)
在这里插入图片描述
7、测试类不变,这样就打印的是“连接oracle数据库”,这样的话就有一个问题,假设我dao实现有很多呢,每次都得需要改serviceImpl的代码,这就不符合java的七大设计原则中的开闭原则(对扩展开放,对修改关闭),现在我们想不改变serviceImpl的代码,实现oracle和mysql的切换:
service实现类修改如下:

package service.impl;

import dao.UserDao;
import dao.impl.OracleImpl;
import dao.impl.UserDaoImpl;
import service.UserService;

public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getData() {
        //UserDao userDao=new UserDaoImpl();
        //UserDao userDao=new OracleImpl();
                userDao.getData();

    }
}

我们在测试中就可以自由切换了,不需要在改动逻辑层的代码了

import dao.impl.OracleImpl;
import org.junit.Test;
import service.UserService;
import service.impl.UserServiceImpl;

public class Mytest {
    @Test
    public void test(){
        UserService userService=new UserServiceImpl( );
        ((UserServiceImpl) userService).setUserDao(new OracleImpl());//强转是因为多态状态下不能实现子类特特有的方法
        userService.getData();
    }
}

控制反转:获得依赖对象的方式反转了。上面的例子就是用了一个set注入,也就是ioc的本质

IOC概念

  1. 采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为 一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
  2. 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)

依赖注入

依赖注入主要是通过三种方式
1、构造器注入(默认是无参构造)
2、Set 方式注入(xml中配置bean,主要是多个类型(list、map、引用类型等)的注入(需要练一下就行))
3、 扩展方式注入(c 命名空间、p 命名空间)注意是需要导入xml约束,实际上也是set方式注入,也就相当于简写了;

bean的作用域

1、singleton:xml中配置的对象默认是单例模式,也就是application中取出的对象都是同一个对象
2、prototype:原型模式,可以通过scope="prototype"配置,也就是application中取出的对象都不相同

bean的自动装配

1、ByName 的时候,需要保证所有 bean 的 id 唯一,并且这个 bean 需要和自动注入的属性的 set 方法的值一致。
2、ByType 的时候,需要保证 bean 的 Class 唯一,并且这个bean 需要和自动注入的属性的类型一致。

注解实现自动装配

1、@Autowired、@Resource
Autowired默认是按照类型来注入的,需要按名字注入的话可以跟@Qualifier搭配使用
Resource是按照里面的name属性来注入的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值