Spring框架 之 IoC和DI(一)

一、什么是Spring

  1. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson开发。
  2. 它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.
  3. Spring的核心是控制反转(IoC)和面向切面(AOP。简单来说,Spring是一个分层的JavaSE/EE full-stack 轻量级开源框架。 
  4. 分层: full-stack,每一个层都提供解决方案                                                                                                                                  
  •    web层:struts,spring-MVC
  •    service层:spring   事务控制  spring
  •  dao层:hibernate,mybatis , jdbcTemplatespring提供了一个模板对象)  --> spring-data

ssh:struts2+spring+hibernate

ssm:spring+springmvc+mybatis

1、2 Spring优点

  1. 方便解耦,简化开发  (高内聚低耦合)
    • Spring就是一个大工厂(容器),可以将所有对象创建依赖关系维护交给Spring管理
    • spring工厂是用于生成bean   (静态工厂模式)

面试题:springIoC(控制反转)底层用到什么设计模式?--  静态工厂模式

  1. AOP编程的支持
    • Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
    • 打印日志
    • 面试题: aop的底层运用到什么设计模式? --  动态代理
  2. 声明式事务的支持   (AOP  动态代理)
    • 只需要通过配置就可以完成对事务的管理,而无需手动编程
  3. 方便程序的测试
    • SpringJunit4支持,可以通过注解方便的测试Spring程序
    • @RunWith(SpringJUnit4ClassRunner.class)
    • @ContextConfiguration("applicationContext.xml")
  4. 方便集成各种优秀框架 *****
    • Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz(任务调度)等)的直接支持
    • Redis
    • Solr  搜索引擎
    • 消息队列 ActiveMQ
    • ……
  5. 降低JavaEE API的使用难度  EJB
    • Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

 

1、3 Spring体系结构

 

核心容器:beanscorecontextexpression

dao  service 对象的创建都交给spring

二、IoC入门

2、1  导入jar包

    4个核心(beans、core、context、expression) + 1个依赖(commons-loggins...jar)

2、2 目标类

  1. 提供UserService接口和实现类
  2. 获得UserService实现类的实例

       之前开发中,直接new一个对象即可:  UsersService service  = new UsersServiceImpl();

      但 学习完spring之后,就可以将由Spring创建对象实例( IoC 控制反转:Inverse of  Control )

     之后需要实例对象时,spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中

  把创建对象的过程交给spring来创建,这就是控制反转IoC,这样就可以降低模块之间的耦合度

2、3 配置文件

  1. 位置:任意,开发中一般在classpath下(src)
  2. 名称:任意,开发中常用applicationContext.xml  (不是必须的。)
  3. 内容:添加schema约束
  4. <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
      <bean id="userService" name="us" class="com.tf.service.impl.UserServiceImpl"></bean>   
      </beans>

2、4  测试类

        //创建ApplicationContext对象

         ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");

         //根据spring的核心对象解析applicationContext.xml配置文件  从配置文件中获取一个UserService 对象

         //spring的配置文件中获取对象的三种方式 :  name 、id、class

         UserService userServiceac.getBean(UserService.class);

         UserService userService2 = (UserService) ac.getBean("userService");

         UserService userService3 = (UserService) ac.getBean("us");

 

         System.out.println(userService==userService2);     //true,证明spring创建的对象默认是单例的

三、DI案例 依赖注入

3、1 DI  Dependency Injection ,依赖注入

类与类之间的依赖关系,比如service层依赖dao层

依赖:一个对象需要使用另一个对象

注入:通过setter方式注入(构造方法constuctor、p标签,)进行对另一个的对象实例设置。

 IoC:把创建对象的过程交给了Spring (<bean ………………>)

DI:通过调用setXXX方法注入另外的对象  <property name=””  ref=””>   普通属性:value   引用数据类型:ref

<!-- 1.dao

      等价于: BookDao bookDao = new BookDaoImpl();

      --> 

      <bean id="bookDao" class="com.it.di.dao.impl.BookDaoImpl"></bean>

     

      <!-- service

        等价于:

        BookService bookService  = new BookServiceImpl();

        bookService.setBookDao(bookDao);

       -->

      <bean id="bookService" class="com.itqf.di.service.impl.BookServiceImpl">

          <!-- 注入dao -->

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

      </bean>

     

 四、schema xml提示

  1. 步骤一:确定xsd文件位    spring-framework-RELEASE\schema\beans
  2. 步骤二:复制路径      
  3. 步骤三:搜索“xml catalog”
  4. 步骤四:添加约束提示

五、核心api

  1.     BeanFactory :这是一个工厂,用于生成任意bean  创建对象(采取延迟加载,第一次getBean时才会初始化Bean         
  2.     ApplicationContext:是BeanFactory的子接口,功能更强大。当配置文件被加载,就进行对象实例化。                     
  •  ClassPathXmlApplicationContext 用于加载classpath下的xml:加载xml运行时位置 --> /WEB-INF/classes/...xml
  • FileSystemXmlApplicationContext 用于加载指定盘符下的xml:加载xml运行时位置 --> /WEB-INF/...xml( 通过java web                       ServletContext.getRealPath() 获得具体盘符)

     六、实例化Bean基于XML

  6、1  实例化方式

  •                   3种bean实例化方式:默认构造、静态工厂、实例工厂

 6、2 默认构造(常用)

public class BookDaoImpl implements BookDao {

    public void add() {
      System.out.println("新增加的图书!");
    }

}

  <bean id="bookDao1" class="com.tf.dao.impl.BookDaoImpl"></bean>

6、3  静态工厂

  1. 常用与spring整合其他框架(工具)
  2. 静态工厂:用于生成实例对象,所有的方法必须是static

编写静态工厂类

public class MyStaticFactory {
   public static BookDao create(){
       return new BookDaoImpl();
   }
}

 <!-- 方法二 静态工厂 -->

  <bean id="bookDao2" class="com.tf.dao.impl.MyStaticFactory" factory-method="create"> </bean>

  • 编写静态工厂类
  • <bean id="bookDao2" class="工厂类对象全路径 " factory-method="静态方法名"></bean>

6、4 实例工厂

     实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。

普通的工厂类  (非静态方法)

//工厂类  

public class MyFactory {
  public BookDao create(){
      return new BookDaoImpl();
  }
}

    <!-- 

        * factory-bean 确定工厂实例

        * factory-method 确定普通方法

    -->

      <!-- 方法三: 工厂模式 -->
   
   <bean id="myFactory" class="com.tf.dao.impl.MyFactory"> </bean>
      <bean id="bookDao3" factory-bean="myFactory" factory-method="create"></bean>

七、作用域

面试:spring bean的作用域?  /   spring Beanscope的取值?

作用域:用于确定spring创建bean实例个数

servlet:单例

struts2action(处理请求):多例

struts2是线程安全还是不安全的?安全的

          spring:bean:默认是单例(singleton)

         bean标签有scope属性可以设置bean的作用域。

      

取值:

       singleton 单例,默认值。

       prototype 多例,每执行一次getBean将获得一个实例。例如:struts整合spring,配置action多例。

面试题: 什么时候bean的作用域需要设计为多例的?

                Ssh整合(或者struts2和spring整合时),action的创建交给spring创建,需要给bean设计为多例的。

配置信息

<bean id="" class=""  scope="">

八、生命周期

  1. 初始化和销毁

 目标方法执行前后执行后,将进行初始化或销毁。

<bean id="" class="" init-method="初始化方法名称"  destroy-method="销毁的方法名称">

例如:

public class BookDaoImpl {
  public void add(){
      System.out.println("添加bean");
  }
  public void init(){
      System.out.println("初始化bean");
  }
  public void destory(){
      System.out.println("销毁bean");
  }   
}
 

<!-- 生命周期相关的属性 -->
     <bean id="bookDao1" class="com.tf.lifecycle.BookDaoImpl" init-method="init" destroy-method="destory"></bean>

猜你喜欢

转载自blog.csdn.net/weixin_42496678/article/details/82790908