SpringFramework~控制反转IOC,依赖注入DI

Spring框架介绍

众所周知,框架就是把基础的通用工作封装起来,采用一种结构化的方式对某个特定的业务领域进行描述,也就是将这个领域相关的技术以代码、文档、模型等方式固化下来,提高代码生产效率和软件质量,提高沟通效率,降低维护成本,Spring则现在最为优秀的框架之一,被广泛使用。
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能介绍如下:

1.核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实
现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
2.Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业
服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
3.Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所
以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的
对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用
程序中。
4.Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库
供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开
和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5.Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、
Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
6.Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。
所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定
到域对象的工作。
7.Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架
变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

核心容器:控制反转IOC

spring容器又叫做IOC,特点是它的控制反转模式,也叫做依赖性介入,意思就是不创建对象,但是描述创建它
们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在
Spring 框架中是 IOC 容器) 负责将这些联系在一起。在典型的 IOC 场景中,容器创建了所有对象,并设置
必要的属性将它们连接在一起,决定什么时间调用方法。
Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个
包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactor
y 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory 支持两个对象模型:
1.单态:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最
常用的对象模型。对于无状态服务对象很理想。
2.原型:模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。
bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。
总而言之,spring容器就是使用JavaBean组件把实体类和对象映射关联起来。
下面是一个Spring框架的xml配置文件:(Annotation配置方式(注解方式)这里暂且不讲)
 1.id属性代表该bean在Spring容器中的唯一标识
 2.class属性指定该bean的类型,需要指定类的全名
<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">   
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

Spring AOP:依赖注入DI

懒加载
IOC容器默认在启动的时候会初始化配置文件中的所有的bean,当不是我们的代码出错而是容器加载出错可以快速提示,帮助我们排除代码错误,这叫做快速失败,大部分情况下不用修改,但特殊的时候我们不需要在容器启动时就加载bean对象,比如项目中的某个功能不常用,我们就不需要项目启动时加载这么多资源,会降低项目时效性造成浪费,需要设置这个bean对象懒加载,就是只有在调用它的时候(getBean)再加载它,具体做法是给这个bean对象加上lazy-init属性,属性值为true,默认是false,一般不写,如下:

<bean id="studentDao" class="com.lanou3g.spring.dao.StudentDaoImpl" lazy-init="true"/>

bean的name属性
由于bean的name属性并不常用,这里不做过多解释,它的作用和id属性一样,给当前的bean对象起名字做标记便于获取,不同之处在于name属性可以设置多个值做名字,之间用逗号隔开,请注意,起多个名字不能重复,更不能和其它bean的name属性值重复。

<bean id="student" name="stu,student1,sd1" class="com.lanou3g.spring.bean.Student">

注入匿名内部bean
注入匿名内部bean这种方式相当于给对象赋值,给对象赋值的方式有两种,一种是通过new对象,然后set对象的属性给对象的属性赋值,一种是通过带参构造函数传递参数给对象赋值,在配置文件中通过bean创建对象也可以给对象赋值,做法如下:

<bean id="outer" class="...">
    <!-- 像set一样实例化对象的方式用这样的注入方式 -->
    <property name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
        </bean>
    </property>
  	
  	<!-- 像带参构造函数实例化对象的方式用这样的注入 -->
    <constructor-arg name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
         </bean>
    </constructor-arg>
</bean>

注入集合类型的属性

注入的本质相通,都是赋值,不解释,list注入方式,Map注入方式:

<!-- lsit注入 -->
<property name="someList">
        <list>
            <!-- 普通元素 -->
          	<value>a list element followed by a reference</value>
            <!-- 引用类型元素 -->
          	<ref bean="myDataSource" />
        </list>
</property>
 <!-- Map注入 -->
<property name="someMap">
        <map>
          	<entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
</property>

注入null和空字符串属性值

<bean class="ExampleBean">
    <property name="email" value=""/>
</bean>

<bean class="ExampleBean">
    <property name="email">
         <!-- 注意这里注入null必须写这样的标签形式,测试时报空指针,value=“null”不行,编译器把它当字			   符串,长度为4 -->
        <null/>
    </property>
</bean>

C命名空间注入构造参数

C命名空间和像使用带参构造方法实例化对象的方式的传统注入方式本质一样,只需要修改一下配置文件的头部信息就可以通过C:注入属性值,比传统注入方式简单方便

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         <!-- 这里需要配置 -->
    xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="beanTwo" class="x.y.ThingTwo"/>
    <bean id="beanThree" class="x.y.ThingThree"/>
    <!-- c命名空间方式注入构造参数 -->
    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
        c:thingThree-ref="beanThree" c:email="something@somewhere.com"/>
</beans>

P命名空间注入构造参数

P命名空间和像通过set方法的方式实例化对象的方式的传统注入方式本质一样,只需要修改一下配置文件的头部信息就可以通过P:注入属性值,比传统注入方式简单方便

<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
    https://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="driver" class="com.demo.Driver" p:car-ref="car" p:dname="张三" />
  <bean id="car" class="com.demo.Car" />
</beans>

PropertyPlaceholderConfigurer工具类注入Properties文件中的属性

使用下面的注入方式,IOC容器启动的时候就会加载数据库连接的各种参数值,更高效,以后需要换数据库的时候,只需要修改jdbc.properties文件的值即可。

<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          p:driverClassName="${jdbc.driver.className}"
          p:url="${jdbc.url}"
          p:username="${jdbc.username}"
          p:password="${jdbc.password}"
          p:maxIdle="${jdbc.maxIdle}"
          p:minIdle="${jdbc.minIdle}"
          p:maxActive="${jdbc.maxActive}"
    />

jdbc.properties文件

jdbc.driver.className=com.mysql.jdbc.Driver	//数据库驱动
jdbc.url=jdbc:mysql://localhost:3306/mydb	//数据库连接地址
jdbc.username=root	//用户名
jdbc.password=root	//密码
jdbc.maxIdle=3	//最大连接数
jdbc.minIdle=1	//最小连接数
jdbc.maxActive=10	//最大空闲数
别的控制参数可以自行设置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值