美文网首页
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