Spring IOC学习笔记

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的生命周期配置

  • 通过配置标签上的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:指定创建容器时,使用哪个配置文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值