什么是Spring?(IOC)

 一.什么是Spring?

它是一个开源的框架,它是一个控制反转(IOC)和面向切向(AOP)的容器框架。
它的主要目的是简化企业开发。

二、Spring IOC/DI

1、什么是IOC(Inverse of control):

IOC 中文含义为控制反转,指的是指应用本身不负责依赖对象的创建和维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转到了外部容器,控制权的转移就是所谓的反转。

2、什么是DI(Dependency Injection):

DI中文含义为依赖注入,指在运行期,由外部容器动态的将依赖对象注入到组件中。

3、Spring IOC 容器的创建:

第一种:在类路径下寻找配置文件来实例化容器.(我们常用的一种)

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

第二种:在文件系统路径下寻找配置文件来实例化容器.(不常用)

FileSystemXmlApplicationContext("applicationContext.xml");

4、Bean的作用域和生命周期:

1)    singleton:Spring IOC容器针对每一个Bean只创建一个实例。(**默认的**)
2)    prototype:Spring IOC容器针对每一个Bean的每一次获取创建一个新的实例。
3)    request、session、global session:这三种作用域用在WEB环境下。

5、实例化bean的三种方式

第一种方式:使用默认无参构造函数

会根据默认无参构造函数来创建类对象。如果bean中没有默认无参构造函数,将会创建失败。
如:
<bean id="userService" class="com.as.service.impl.UserServiceImpl" />
此时UserServiceImpl中必须有无参的构造函数。

第二种方式:spring管理静态工厂-使用静态工厂的方法创建对象

模拟一个静态工厂,创建业务层实现类

package com.as.factory;

import com.as.service.IUserService;
import com.as.service.impl.UserServiceImpl;

public class StaticFactory {
    public static IUserService createUserService(){
        return new UserServiceImpl();
    }
}

bean的配置,使用StaticFactory类中的静态方法createUserService创建对象,并存入spring容器:

id 属性:指定bean的id,用于从容器中获取

class属性:指定静态工厂的全限定类名

factory-method 属性:指定生产对象的静态方法

~~~
修改配置文件,添加Bean初始化方法和销毁方法的配置如下:
<bean id="userService" class="com.as.StaticFactory" factory-method="createUserService" />
~~~

第三种方式:spring管理实例工厂-使用实例工厂的方法创建对象

先把工厂的创建交给spring来管理。然后在使用工厂的bean来调用里面的方法

factory-bean属性:用来指定实例工厂beand的id。

factory-method属性:用于指定实例工厂中创建对象的方法。

--实例工厂
	<bean id="instance" class="com.as.service.impl.UserServiceImpl"></bean>
	
	--实例工厂中创建对象
	<bean id="userService" factory-bean="instance" factory-method="getIntance">
	<property name="XXX" value="AAA"></property>
	<property name="XXX" value="BB"> </property>
	</bean>

6、注入依赖对象的分类:

依赖注入:Dependency Injection。它是spring框架核心IOC的具体实现。

我们的程序在编写时,通过控制反转,把对象的创建交给了spring,但是在代码中不可能出现没有依赖的情况。IOC解耦只是降低他们的依赖关系。

但不会消除。例如:我们的业务层仍会调用持久层的方法。简单的说就是spring框架把持久层对象传入业务层,而不用我们自己去获取。

1)    根据注入依赖对象的类型分类:

                基本类型对象的注入
                注入其他Bean

2)    注入依赖对象的方式:

                构造器注入
                属性Setter方法注入
                工厂注入(不常用)

3)    注入依赖对象的编程方式:
                 手动装配
                XML方式
                注解方式
                自动装配:自动装配:autowire属性:byName,byType
自动装配:autowire属性:byName,byType

<!-- 自动装配 byName按名称在前文件中找与属性名称相同的id的bean -->
<!-- 	<bean id="usersService" class="com.hd.service.UsersService" 
autowire="byName"></bean> -->

<bean id="usersService" class="com.hd.service.UsersService" 
autowire="byType"></bean>

7、P空间的使用:

使用p名称空间注入数据
在xml中导入p名称空间,使用p:propertyName来注入数据,本质仍然是调用类中的set方法实现注

入功能。

所以,UserServiceIpml实现类,不需要改变。只需要修改spring的配置文件即可

第一步:修改xml的命名空间,即添加p命名空间

添加了一句:

xmlns:p="http://www.springframework.org/schema/p"

例1:
<bean id="user" class="com.spring.domain.User" 
p:username="username" p:password="admin"/>

例2:
<bean id="userService" class="com.spring.service.impl.UserServiceImpl"
p:userDao-ref="userDao"/>

8、使用注解方式注入依赖对象:

1)    使用注解方式注入,必须添加context命名空间的配置:

2)    添加注解处理器的配置:

<!-- 启用spring mvc 注解开关  -->
<context:annotation-config/>

3)    注入依赖对象的注解:

@Resource:
首先,该注解要配置在类中字段上,默认按照字段的名称与IOC容器中的<bean>的ID进行匹配进行装配,如果不能找到与之匹配的<bean>,则按照字段的类型进行匹配。
另外,可以使用该注解的name属性(@Resource(name="userDao"))的值来进行与IOC容器中的<bean>的ID进行匹配。

注意:如果指定了name属性,那么就只能按照名称来匹配,即便没有匹配上。

@AutoWired:按照字段的类型来进行匹配IOC容器中的<bean>的ID进行装配。

@Qualifier("…"):与@AutoWired注解结合使用,限定@AutoWired使用名称的方式来与IOC容器中的ID进行匹配。

9、使用自动扫描的方式把组件纳入到容器中管理:

@Component:泛指组件,可以应用在任何需要纳入到Spring容器中的bean。
@Repository:将数据访问层的组件纳入到Spring容器中。
@Service:将业务层组件纳入到Spring容器中。
@Controller:将控制层组件纳入到Spring容器中。

注意:在使用以上注解时,需要先配置扫描机制,代码如下:

<context:component-scan base-package="…">

其中base-package为需要扫描的包,    包含子包。

三、例子

<?xml version="1.0" encoding="UTF-8"?>
 <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
        http://www.springframework.org/schema/beans/spring-beans.xsd">
     <!--配置 service -->
 <!-- 第一种方式,使用默认无参构造函数
     <bean id="userService" class="com.as.service.impl.UserServiceImpl" scope="prototype"/>
 -->
     <!--第二种方式,spring管理静态工厂-使用静态工厂的方法对象创建-->
 <!--
     <bean id="userService" class="com.as.factory.StaticFactory" factory-method="createUserService" />
 -->
     <!--第三种方式,spring管理实例工厂,使用实例工厂的方法创建对象-->
 <!--
     <bean id="instanceFactory" class="com.as.factory.InstanceFactory"/>
     <bean id="userService" factory-bean="instanceFactory" factory-method="createUserService" />
 -->
 
     <!--通过构造函数实现依赖注入-->
 <!--
     <bean id="userService" class="com.as.service.impl.UserServiceImpl" >
         <constructor-arg name="name" value="张三"></constructor-arg>
         <constructor-arg name="age" value="18"></constructor-arg>
         <constructor-arg name="birthday" ref="now"></constructor-arg>
     </bean>
     <bean id="now" class="java.util.Date" />
 -->
     <!--通过set方法实现依赖注入-->
     <!-- 通过配置文件给 bean 中的属性传值:使用 set 方法的方式
     涉及的标签:
         property
     属性:
         name:找的是类中 set 方法后面的部分
         ref:给属性赋值是其他 bean 类型的
         value:给属性赋值是基本数据类型和 string 类型的
     实际开发中,此种方式用的较多。
 
     <bean id="userService" class="com.as.service.impl.UserServiceImpl">
         <property name="name" value="test"/>
         <property name="age" value="21"/>
         <property name="birthday" ref="now" />
     </bean>
 
     <bean id="now" class="java.util.Date" />
 -->
     <!--使用p命名空间-->
 <!--
     <bean id="userService" class="com.as.service.impl.UserServiceImpl" p:name="testp" p:age="23" p:birtasy-ref="now"/>
     <bean id="now" class="java.util.Date" />
 -->
     <!-- 注入集合数据
         List 结构的:
             array,list,set
         Map 结构的
             map,entry,props,prop
 -->
     <bean id="userService" class="com.as.service.impl.UserServiceImpl2">
         <!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
         <!-- 给数组注入数据 -->
         <property name="myStrs">
             <array>
                 <value>AAA</value>
                 <value>BBB</value>
                 <value>CCC</value>
             </array>
         </property>
         <!-- 注入 list 集合数据 -->
         <property name="myList">
             <list>
                 <value>AAA</value>
                 <value>BBB</value>
                 <value>CCC</value>
             </list>
         </property>
         <!-- 注入 set 集合数据 -->
         <property name="mySet">
             <set>
                 <value>AAA</value>
                 <value>BBB</value>
                 <value>CCC</value>
             </set>
         </property>
         <!-- 注入 Map 数据 -->
         <property name="myMap">
             <props>
                 <prop key="testA">aaa</prop>
                 <prop key="testB">bbb</prop>
             </props>
         </property>
         <!-- 注入 properties 数据 -->
         <property name="myProps">
             <map>
                 <entry key="testA" value="aaa"></entry>
                 <entry key="testB">
                     <value>bbb</value>
                 </entry>
             </map>
         </property>
     </bean>
 </beans>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值