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

通过配置<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:指定创建容器时,使用哪个配置文件。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容