Java——Spring(1)

 

 

 

 

 

 

 

 

 实例解析:

人依赖车回家,Audi和Buick这两类车继承车这个接口,张三、李四继承有车一族类,有车一族类继承人类这个接口;

首先,创建各个bean,车类接口定义了车启动、车左转、车右转的方法,Audi和Buick继承车类所以也都实现了这个接口;

人类接口定义了一个回家的方法,有车一族类要定义有车,也就是要实例化车类,且也要实现回家的方法,被依赖的Bean要通过构造方法执行注入,所以:

 

 

 

最后的张三李四要依赖车类然后重写回家方法,所以也要通过构建方法注入车类:

 

 

 

最后,我们通过创建一个Ioc来创建bean、保存bean且提供bean;

 

 

 

 

 

 

 

 

 测试:

优点:

 

 在实际用Spring进行开发时Ioc是不用那么麻烦创建的:

首先:需要在pom.xml上引入相关的Spring支持jar包:

 

 然后配置一个spring.xml,里面就配置了所管理的Bean以及对应的Bean所在java文件:

 

 最后在使用的时候通过context获取Spring上下文就可联系xml配置文件且取出Bean:

 

 Spring实例化Bean:

 

 上面的一种就是通过构造方法实例化Bean;

静态方法:

首先要定义一个获取静态方法类:

 

 在Spring.xml上的配置是:

 

 最后还是通过getBean()来获取实例化,此时是通过静态方法来获取实例化Bean:

 

 

 

 

通过实例化实例化Bean:

将原本定义的Bean工厂类的static去掉,在Spring.xml的配置是:

 

 其中第一个是先实例化Bean工厂,第二个再调用工厂里的getBean方法;

 

 

 

Bean的别名:如果要实例化多个对象的时候就需要定义好不同的别名来加以区分,在Spring.xml文件中:

 

 其中别名之间用逗号隔开,也可用<alias>来做别名,不过这个标签只能做一个别名,实现不了多个:

 

 

 

注入Bean属性值

 

 通过构造方法注入Bean;

首先要在Bean类提供一个构造方法:

 

 然后在spring.xml进行配置:

 

 由于我们重新构造了构造方法,所以默认的构造方法就不见了,这时在进行<bean>配置时需要输入对应的参数,即<constructor-arg>标签定义,index表示第几个参数,name表示参数名,type表示参数类型,如果参数是对象,即用ref,ref表示实例化的类,value则表示String、浮点数等的值;这里的index、name、type完全没必要都写出来,只要可以表示其参数的唯一性即可,比如index、name,而type则不可单独使用来表示参数;

 

 

 

通过set方法注入Bean:

首先要对属性进行get/set方法建立:

 

 然后在spring.xml进行配置:

 

 

 

 

简化写法:

在spring.xml文件中添加:

 

 然后c表示构造函数、p则表示属性进行配置:

 

 其效果是和上面的配置是一样的

 

集合类型的Bean注入

Bean类里的属性:

 

 spring.xml里的配置:

        <property name="stringList">
            <list>
                <value>aaaaa</value>
                <value>ddddd</value>
            </list>
        </property>
        <property name="anotherBeanList">
            <list>
                <ref bean="anotherBean"></ref>
                <ref bean="anotherBean"></ref>
            </list>
        </property>
        <property name="stringSet">
            <set>
                <value>aaaaa</value>
                <value>ddddd</value>
            </set>
        </property>
        <property name="anotherBeanSet">
            <set>
                <ref bean="anotherBean"></ref>
                <ref bean="anotherBean"></ref>
            </set>
        </property>
        <property name="stringMap">
            <map>
                <entry key="cccc" value="ddddd"/>
                <entry key="aaaa" value="bbbbb"/>
            </map>
        </property>
        <property name="anotherBeanMap">
            <map>
                <entry key-ref="anotherBean" value-ref="anotherBean"/>
                <entry key-ref="anotherBean" value-ref="anotherBean"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="aaaa">bbbb</prop>
            </props>
        </property>

 

 

null值注入:

 

 

 

 

注入时创建内部Bean:

spring.xml是这样注入内部对象类的:

 

 先实例化对象,再通过id调用:

 

 如果使用注入时创建内部Bean,则可以:

 

 

Bean作用域

 

 

 Singleton以及pritotype这两个值可以在实例化Bean时进行赋值,没设置就会默认是单例模式,通过scope属性:

 

 

 Singleton模式:单例模式,在一个上下文模式中,只会实例化一个Bean作为值赋给多个别的Bean的属性;

prototype模式:多例模式,每次上下文请求实例过程中,都会生成新的Bean实例,即使是在同一个上下文模式中;

举一个例子:Bean1是依赖Bean2的:

 

 

 

方法注入:

如果Bean2是多例模式,而Bean1是单例模式,我们想通Bean1得到的Bean2是不一样的实例,这个时候就需要用到方法注入,具体实现:

 

 

 

 

 

 

 

自定义作用域:

要实现一个类,继承Scope:

 

 

 可以通过重写get方法自定义作用于,如单线双例可以这样改:

 

 

 这里的name参数就是一个实例,如果没有这个实例则通过objectFactory创建一个新的,如果有了就直接返回这个实例;

然后在spring.xml:

 

 

 SimpleThreadScope是spring内置的一个模式:单线单例模式:

 

 

 

 

 

 

Bean的懒加载

 

 

 

操作:

 

 

 场景:

 

 

 

 

 

 

 

Bean初始化:

 

 

 Bean销毁:

 

 

 

 

 

 

 

 

 

Bean属性继承:

场景一:两个子类继承一个父类:

 

 

 

场景二:两个类同时具有多个一样的属性:

 

 

 这样就可以大大简化重复属性的代码

 

 

 

认识注解:

通过注解简化xml配置

xml   VS   annotation

xml:

 

 

 

annotation:

 

 上面这个图有点小错误:注入的BeanConfiguration.class应该是和上面定义的文件名是一致的,也就是应该改成:MyConfiguration.class。

但是这样感觉还不是很简洁,如果有很多很多的Bean需要管理还是会产生很多代码,这个时候就用到component-scan:包扫描:

 

 这里component-scan后都指定一个包路径;再通过在Bean类上增加component注解来表示该Bean需要被扫描,同时为Bean添加一个id,这里只能指定一个别名,如果要指定多个可看以下内容进行别名,这个id别名可用于实例化时进行指定:

 

 根据不同的层有不同的标注方式:

 

Bean别名

 

 

 

 

通过注解注入Bean:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

通过注解设定Bean的作用域:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

通过注解开启Bean的懒加载:

 

 

 

 

通过注解编写Bean的初始化及销毁

 

 

 

 

 

posted @ 2020-04-02 14:04  xiao兆  阅读(184)  评论(0编辑  收藏  举报