Spring初探(IOC,AOP,DI)

Spring的引出:

问题1:依赖配置信息。。。

class UserDaoImpl implements UserDao {
    //数据库连接信息,需要一些配置,但是又不能写在这个类中(硬编码,改的时候麻烦)
    private String jdbcUrl = "...";
    private String driverClass;
    private String username;
    private String password;
    // ...
}

把这些配置信息放在外部的一个配置文件中:

jdbc.properties
----------------
jdbcUrl = ....
driverClass = ....
...
...

问题2:依赖其他的对象。。。

class UserServiceImpl{
        //和具体的实现类耦合在一起了
        //private UserDao userDao = new UserDaoImpl();
        //可以采用工厂的方式解决这个问题
    private UserDao userDao = Factory.getUserDao();

}工厂里可以采用反射生成实例    

配置文件:

jdbcUrl        = jdbc:mysql:///test2
driverClass    = com.mysql.jdbc.Driver
username       = root
password       = root
public class UserDaoImpl implements UserDao {
    private String jdbcUrl;
    private String driverClass;
    private String username;
    private String password;
    // ...
    public UserDaoImpl() {
        // 读取配置文件
        String resource = "cn/itcast/spring/a_helloworld/jdbc.properties";//一定要加包名
        Properties props = loadProperties(resource);
        // 并初始化信息
        jdbcUrl = props.getProperty("jdbcUrl");
        driverClass = props.getProperty("driverClass");
        username = props.getProperty("username");
        password = props.getProperty("password");
    }

    /**
     * 加载配置文件
     */
    private Properties loadProperties(String resource) {
        InputStream inputStream = null;
        try {
            //带类加载器(getClassLoader())的情况资源要加包名,因为这种情况是在classpath下面查找。
            //cn/itcast/spring/a_helloworld/jdbc.properties
            inputStream = this.getClass().getClassLoader().getResourceAsStream(resource);
            Properties props = new Properties();
            props.load(inputStream);
            return props;
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

==================================================================

怎么样才能不依赖实现类呢?

可以使用工厂模式,让UserDao的实现在在工厂中生成,而工厂是可以配置的,如下:

// 一、定义工厂类
public class BeanFactory {
    // 用于存放“对象名--实现类的全名”这种对应关系的键值对集合
    private static Properties properties;

    static {
        // 读取配置文件 ObjectFactory.properties,具体代码略。
        properties.load(inStream);
    }

    // 可创建对象实例的工厂方法,接受的参数是对象名,如UserDao、RoleDao等
public static <T>T getBeanInstance(Class<T> clazz) {
        try {
            String className = props.getProperty(clazz.getSimpleName());
            return (T)Class.forName(className).newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

// 二、使用工厂生成实例
# UserDao = cn.itcast.dao.impl.MySQLUserDaoImpl
# UserDao = cn.itcast.dao.impl.OracleUserDaoImpl
UserDao = cn.itcast.dao.impl.MySQLUserDaoImpl

// 三、使用工厂生成实例
public class UserServiceImpl {
    private UserDao userDao = (UserDao) BeanFactory.getBeanInstance("UserDao");
    // ...
}

以上代码就是通过工厂实现的与实现类的解耦,这种情况下如果想要更新别外一个实现类,只需要修改配置文件就可以了。

控制反转(IOC,Inversion of Control)

  所谓控制反转就是应用程序本身不负责依赖对象的创建及对象之间关系的维护,而是由外部容器负责的,通过容器来实现对象组件的装配和管理,这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的控制反转。

  IoC是一个很大的概念,可以用不同的实现方式来实现。

  例如:<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。

     <2>依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型。

 依赖注入(DI,Dependency Injection)

当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean 类可以改成如下:
public class PersonServiceBean {
     private PersonDao personDao ; // 要有getter与setter

     // 通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean
     public PersonServiceBean(PersonDao personDao){
         this.personDao=personDao;
     }
    // 当然也可以使用setter方法进行注入。
  public void save(Person person){ personDao.save(person); } }

所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

面向切面编程(AOP,Aspect Oriented Programming)

  AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。使用JDK的动态代理可以实现AOP,

Spring是一个开源的控制反转(IoC)面向切面(AOP)的容器框架。它的主要目是简化应用的开发。

1.1. 使用Spring有什么好处

在项目中引入spring立即可以带来下面的好处

l  降低组件之间的耦合度,实现软件各层之间的解耦。

l  可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。

l  容器提供单例模式支持,开发人员不再需要自己编写实现代码。

l  容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。

l  容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。

l  Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。

===================================================

使用:

applicationContext.xml

  <!-- 配置UserDao对象,需要注入一些配置 -->
    <bean id="userDao" class="cn.itcast.spring.b_springhelloworld.UserDaoImpl">         //name是UserDaoImpl中的属性名
        <property name="jdbcUrl" value="jdbc:mysql:///test111"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    <!-- 配置UserService对象,需要依赖UserDao对象 -->
    <bean id="userService" class="cn.itcast.spring.b_springhelloworld.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>
@Test
public void testGetUserDao() {
    // Spring的容器对象
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("cn/itcast/spring/b_springhelloworld/applicationContext.xml");  
   // Spring的容器对象
   Resource resource = new ClassPathResource("cn/itcast/spring/b_springhelloworld/applicationContext.xml");
   BeanFactory beanFactory = new XmlBeanFactory(resource);
// 从中取出配置的Bean
   UserDao userDao = (UserDao) applicationContext.getBean("userDao");
   UserService userService = (UserServiceImpl) applicationContext.getBean("userService");
}
时间: 2024-10-14 06:59:34

Spring初探(IOC,AOP,DI)的相关文章

深入解析spring的IOC和DI

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在此之前先说一下没有</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">spring</span>&l

对Spring中IOC和DI的理解

前几篇讲了Spring中IOC和DI的用法,本篇应该放到三篇之前,但一直没有想到好的讲解方式,后参考https://blog.csdn.net/luoyepiaoxue2014/article/details/72426666博客,对其中涉及到的进行了简单的总结. 在学习Spring的过程中,总会涉及到两个概念---IOC和DI,即控制反转和依赖注入,而对这两个概念的理解也总是含糊不清的,下面就对自己的理解进行总结. 首先是IOC,即控制反转,需要理解的是:怎么控制?谁控制了什么?怎么反转?既然

Spring的Ioc与DI

一.前言 Spring框架的核心基于控制反转的原理. IoC是一种将组件依赖关系的创建和管理外部化的技术. 考虑一个示例,其中Foo类依赖于Bar类的实例来执行某种处理. 传统上,Foo使用new运算符创建Bar的实例,或者从某种工厂类中获取一个实例. 使用IoC方法,运行时某些外部进程会将Bar的实例(或子类)提供给Foo. 这种行为,即在运行时注入依赖项,导致IoC被Martin Fowler重命名为更具描述性的依赖项注入(DI).依赖注入是IoC的一种特殊形式,尽管您经常会发现这两个术语可

JavaWeb_(Spring框架)Spring中IoC与DI概念入门

Spring是于2003 年兴起的一个轻量级的Java 开源框架,它由Rod Johnson创建.传统J2EE应用的开发效率低,Spring作为开源的中间件,提供J2EE应用的各层的解决方案,Spring贯穿了表现层.业务层及持久层,而不是仅仅专注于某一层的方案.可以说Spring是企业应用开发的“一站式(full-stack)”选择.然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合. 简单来说,Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. Spri

spring的ioc,di,mvc 的简单逻辑(根据网课和百度)

为了提升自己的技术所以没事自己通过百度和找资料来学习了一下spring的思想所以就记录一下 这个是比较简单的一种,有点乱.我按照自己的理解写的有注释,但是不知道是不是都是正确,如果有错误希望批评指正谢谢. 总结: 1:首先要了解spring的整体: 主要作用就是ioc di mvc 和 aop ,所以要从这几个方面去入手. 想要指导思想就要从头开始,所以就总结了一下整个流程,如下: 一:首先要配置spring 1:配置web.xml中的DispatcherServlet 2:设定 init-pa

Spring 之 IOC ,DI 理论

本文是依照极客学院java<Spring之IOC>章节学习的心得.随笔记录 浅谈IOC:(Inversion of Control, 控制反转) Spring 核心容器,贯穿始终.所谓IOC,对Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系: 1. 传统开发模式:对象之间互相依赖 2. IOC开发模式:IOC容器安排对象之间的依赖(中间加入一个管理控制中介) IOC理论的背景: 图一为传统设计对象相互引用的模式,所有的对象同过相互之间的合作实现系统的逻辑,相互耦

Spring中IOC与DI的的区别

依赖注入的前提: 有IOC的环境,也就是将必须对象的创建权交给了Spring. DI 介绍 Dependency Injection 依赖注入.需要有IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去. IOC与DI的的区别: IOC:  控制反转,将类的对象的创建交给Spring类管理创建. DI:    依赖注入,将类里面的属性在创建类的过程中给属性赋值. DI和IOC的关系: DI不能单独存在,DI需要在IOC的基础上来完成. 这样做得好处:做到了单一

Spring框架IOC,DI概念理解

1.什么是框架? 框架是一种重复使用的解决方案,针对某个软件开发的问题提出的. Spring框架,它是一个大型的包含很多重复使用的某个领域的解决方案. Spring的理念:不要重复发明轮子. 2.Spring的理解? 首先,Spring是一个容器.它是装对象的.主要就是通过搜索class的路径.找出bean对象,实际就是根据反射来获取这个bean对象的: Class<?> classit=Class.forName("com.jinglin.model.Person");

对Spring的IoC和DI最生动的解释

首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq号.电话号.ip号.iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节.传统的程序开发也是如此,在