美文网首页
Spring IOC学习笔记

Spring IOC学习笔记

作者: 肥猫说 | 来源:发表于2019-08-11 10:25 被阅读0次

1 Spring的IOC理解

Spring IOC 思想的理解:

Inversion of Control 控制反转,就是把对象的创建权交给Spring。一般情况下,一个类要依赖另一个类的对象的时候,我们就会在这个类中new一个被依赖的对象。比如现在有一个Service,为了实现对数据库的操作,Service要依赖Dao,传统方式下,我们会在Service中new一个Dao的对象,这个时候,创建Dao对象的控制权在Service自己手中,而Spring就是一个管理Bean对象的容器,任何对象都可又Spring进行创建和管理,其他类的对象如果想要获得哪个Bean对象的会,可以直接从Sping容器中获取,而不需要自己去new来创建一个对象,因而创建对象的方式反转了,由原来的自己创建到由Spring创建,这就是IOC思想。

1.1 将bean的创建权利交由Spring来管理

现在在com.sitech.model包下有一个User.java类,要将User对象的创建权交由Spring,并由Spring容器来管理User对象,需要在Spring的配置文件中进行如下配置:其中name就相当与User user = new User()中的user对象的引用,class是User对象的完整类名(包名.类名)。

<bean name="user" class="com.sitech.model.User"></bean>

<!--或者如下配置,id和name的作用一,只是id不能重复,且不能使用特殊字符-->

<bean id="user" class="com.wu.model.User"></bean>

1.2 Spring的DI(依赖注入)方式

要实现IOC思想就需要有DI做技术上的支持,依赖注入就是将其依赖对象的属性值注入到其对应的属性上。

常用的属性DI(依赖注入)的方式:

set方法注入:现在为user对象的name属性和age属性注入值。property的name属性指定要注入的属性名称,value指定该属性名称所要注入的值。

<bean id="car" class="com.wu.model.Car"></bean>

<bean name="user" class="com.wu.model.User">

    <!--值类型的注入-->

    <property name="name" value="tom"></property>

    <property name="age" value="20"></property>

    <!--引用类型的注入,前提是该引用的对象已经在Spring中配置过了,由Spring容器管理-->

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

</bean>

 构造方法的注入:

public User{

    private String name;

    private int age;

    Car car;

    User(String name,Car car){

        this.name=name;

        this.car=car;

    }

    User(Car car,String name){

        this.name=name;

        this.car=car;

    }

    get,set....

}

<bean id="car" class="com.wu.model.Car"></bean>

<!--调用第一个构造方法-->

<bean id="user" class="com.wu.model.User">

    <constructor-arg name="name" index="0" type="java.lang.String" value="tom"/></constructor-arg>

    <constructor-arg name="car"index="1" ref="car"/></constructor-arg>

</bean>

字段注入

依赖注入的类型:

值类型的注入:

<bean id="car" class="com.wu.model.Car"></bean>

<bean name="user" class="com.wu.model.User">

    <!--值类型的注入-->

    <property name="name" value="tom"></property>

    <property name="age" value="20"></property>

    <!--引用类型的注入,前提是该引用的对象已经在Spring中配置过了,由Spring容器管理-->

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

</bean>

复杂类型的注入:

<bean id="car" class="com.wu.model.Car"></bean>

<bean name="collectionBean" class="com.wu.model.CollectionBean">

    <!--数组的注入,多个元素注入。假设CollectionBean类中有一个Sring[] arr数组-->

    <property name="arr">

        <array>

            <value>tom</value>

            <value>lisi</value>

            <ref bean="user4"/>

        </array>

    </property>

    <!--List集合的注入,多个元素注入。假设CollectionBean类中有一个List list集合-->

    <property name="list">

        <list>

            <value>tom</value>

            <value>lisi</value>

            <ref bean="user4"/>

        </list>

    </property>

    <!--Map的注入,多个元素注入。假设CollectionBean类中有一Map map-->

    <property name="map">

        <map>

            <entry key="name" value="tom"></entry>

            <entry key-ref="user4" value-ref="user2"></entry>

        </map>

    </property>

    <!--Properties类型的注入,多个元素注入。假设CollectionBean类中有一个Properties pop-->

    <property name="pop">

        <props>

            <prop key="username">tom</prop>

            <prop key="password">123</prop>

        </props>

    </property>

</bean>

1.3 bean的scope属性(bean的作用范围)

singleton:默认值,单例的。被标示为单例的bean对象在Spring容器中只存在一个。

prototype:多例原形,被标示为多例的bean对象在每次都获得的时候都会被创建,每次创建的都是新的对象。

request:被标示额为request对象的生命周期与web环境下的request的生命周期一致。

session:被标示额session对象的生命周期与web环境下的session的生命周期一致。

globalSession:应用在Porlet环境。如果没有Porlet环境那么globalSession相当于web环境下的session。

1.4 bean的生命周期配置

通过配置<bean>标签上的init-method属性作为Bean的初始化的时候执行的方法,配置 destroy-method属性作为Bean的销毁的时候执行的方法。

销毁方法想要执行,需要是单例创建的Bean而且在工厂关闭的时候,Bean 才会被销毁。

先假设User类中有一个init()方法和一个destroy()方法,init()方法 需要在User对象创建初始化的时候执行,destroy()方法需要在User对象销毁的时候执行,则可以在Spring中进行如下配置:

<!--空参构造创建方式-->

<bean name="user" class="com.sitech.model.User"

      init-method="init" destroy-method="destroy"></bean>

1.5 Spring对象的创建方式

空参的构造方式:

<!--空参构造创建方式-->

<bean name="user" class="com.wu.model.User"></bean>

静态工厂:factory-method="getUser"表示由静态工厂的getUser方法创建User对象。

//静态工厂类

public class UserFactory{

    //静态的getUser方法创建User对象

    public static User getUser(){

        return new User();

    }

}

<!--静态工厂创建方式-->

<bean name="user2" class="com.wu.model.User" factory-method="getUser"></bean>

实例工厂

//实例工厂类

public class UserFactory{

    //getUser实例方法创建User对象

    public User getUser(){

        return new User();

    }

}

<!--首先将实例工厂类交由Spring容器管理,再由实例工厂创建方式,-->

<bean id="user3Factory" class="com.wu.model.UserFactory"></bean>

<bean id="user3" factory-bean="user3Factory" factory-method="getUser()"></bean>

2 Spring注解

配置扫描注解。

<!--Spring 的注解开发:组件扫描,扫描com.wu.model包下以及所有子孙包下的类--->

<context:component-scan base-package="com.wu.model">

@Component:组件,作用在类 上,可以直接使用属性注入的注解。它有三个衍生注解:@Controller :用于WEB 层、 @Service :用于业务层、@Repository :用于持久层。

@Value :用于注入普通类型。

//通过反射方式,破坏了封装性。

@value("tom")

private String name;

//通过set方法赋值,推荐使用

@value("tom")

public void setName(String name){

    this.name=name;

@Autowired :自动装配,默认按类型进行装配。按名称注入: @Qualifier强制使用名称注入。

@Resource :相当于@Autowired 和@Qualifier 一起使用。

@Scope:bean的生命周期.@Scope(scopeName="singleton"):单例;@Scope(scopeName="prototype"):多例。

@PostConstruct :相当于 init-method。

@PreDestroy :相当于 destroy-method。

@RunWith:运行器,@RunWith(SpringJUnit4ClassRunner.class):让测试运行于Spring测试环境。

@ContextConfiguration:指定创建容器时,使用哪个配置文件。

相关文章

网友评论

      本文标题:Spring IOC学习笔记

      本文链接:https://www.haomeiwen.com/subject/esujjctx.html