从来就没有救世主  也不靠神仙皇帝  要创造人类的幸福  全靠我们自己  

spring

 

  下载地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring

  maven仓库地址:https://mvnrepository.com/search?q=spring

 

 bean装配方式的选择:优先自动装配、然后用基于javaConfig的装配、最后xml配置

 

1. ioc容器  基于xml装配

  ioc:inversion of control,控制反转。将创建对象的工作交给框架完成。

  基于xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="classA" class="com.xt.abc.impl.ClassA" ></bean>
</beans>

 

  1.1 ApplicationContext应用上下文

  读取完配置文件(或注解),默认情况下就会通过反射创建对象,并组装对象

  此接口的实现类:需要spring-context.jar

FileSystemXmlApplicationContext     从可访问的任意磁盘路径上加载配置文件
ClassPathXmlApplicationContext      从类的根路径上加载(基于XML配置)
WebXmlApplicationContext            在一个Web应用的范围内加载
AnnotationConfigApplicationContext  通过配置类加载bean

    使用示例:

ApplicationContext context = new ClassPathXmlApplocationContext("xxx.xml");
ClassA classA = context.getbean(xxx.ClassA.class);

 

 

  1.2 bean对象

  配置中定义的,而由Spring IOC 容器实例化、组装、管理的对象

(1)属性:

id:唯一标识,用于获取对象
class:类全限定名,用于反射创建对象
scope:对象作用域
    singleton:默认,单例
    prototype:多例
    request:WEB项目中,表明创建的此对象存入request域
    session:WEB项目中,表明创建的此对象存入session域
    global session:WEB项目中,集群环境下的一个session中
init-method:指定实例化bean时要调用的方法
destroy-method:指定从容器中移除销毁bean时要调用的方法

 

(2)作用域和生命周期

  bean的scope属性指定:

singleton:单例,默认
prototype:多例,每次获取对象时,都创建返回一个新的对象
request:每次Http请求都会创建一个新的对象,此对象只在当前请求有效
session:同一个HTTP Session共享一个对象,不同的session获得的是不同的对象
global-session:集群环境下,一个session共享一个对象

 

  生命周期:

单例:
    对象创建:容器创建后,就创建对象(配置文件加载后就创建)
    对象销毁:容器销毁时,销毁容器
多例:
    对象创建:每次获取对象时才创建(每次getBean("xxx")时创建)
    对象销毁:由java垃圾回收器回收

 

(3)容器创建bean对象的三种方式

  ①默认的,通过 class属性指定的类的无参构造创建

<bean id="xxx" class="com.xt.ClassA" />

  如上,ClassA的实例化会通过其无参构造创建

 

  ②工厂创建

  即spring容器实例化工厂,但另一个类对象通过工厂对象的某个方法创建

<bean id="instanceFactory" class="com.xt.factory.InstanceFactory" />
<bean id="classa" factory-bean="instanceFactory" factory-method="createClassA"/>

  如上,获取ClassA类对象时,通过InstanceFactory类对象的 createClassA() 方法获取 

  ③静态工厂

<bean id="classa" class="com.xt.factory.StaticFactory" factory-method="createClassA"/>

  通过StaticFactory的静态方法createClassA() 获取对象

 

1.3 依赖注入

  通过IOC,对象的创建交给了Spring容器;而对象的依赖关系通过依赖注入,也由spring控制

  注入的数据:①基本类型、String  ②其它bean   ③集合类型

  注入方式:①构造函数注入 ②setter方法  ③注解

(1)构造函数注入

  构造函数需要的参数通过 constructor-arg标签传入  

constructor-arg标签
    name:参数在构造函数中的名称,常用
    index:指定参数在构造函数参数列表中的索引位置(从0开始)
    type:指定参数在构造函数中的数据类型
    value:参数的值,只能是基本类型和String类型
    ref:指定引用类型参数,可为其它配置过的bean类型

 

  例:有一个类ClassA,其对象需要通过 有两个参数(例一个String name、一个int age)的构造函数 创建

<bean id="classa" class="com.xt.ClassA">
    <constructor-arg name="name" value="xt"> </constructor-arg>
    <constructor-arg name="age" value="20"> </constructor-arg>
</bean>

  如果构造函数还需要一个引用类型参数,如Date date

<bean id="classa" class="com.xt.ClassA">
    <constructor-arg name="name" value="xt"> </constructor-arg>
    <constructor-arg name="age" value="20"> </constructor-arg>
    <constructor-arg name="date" ref="now"> </constructor-arg>
</bean>

<bean id="now" class="java.util.Date"> </bean>

 

  问题:

     如果创建对象时用不到这些数据了,也必须要提供注入,否则无法创建对象

 

(2)setter方法

  对象通过无参构造创建

  通过property标签注入:

property标签
    name:参数名(setter方法set字母后面那部分)
    value:值,基本联系和String类型
    ref:其它bean

 

  例:ClassA有三个参数,有对应的setter方法

<bean id="classa" class="com.xt.ClassA">
    <property name="name" value="xt"> </property>
    <property name="age" value="20">  </property>
    <property name="date" ref="now"> </property>
</bean>

<bean id="now" class="java.util.Date"> </bean>

  

  String传递空串和null:

<bean id="classa" class="com.xt.ClassA">
    <property name="str1" value=""/>         
    <property name="str2"><null/></property>
</bean>

 

------

  注入集合数据:数组、List、Set、Map、Properties

  通过构造或setter方式里面的子标签 <list>、<array>、<set> 、<map>、<entry>、<props>

 

  例:ClassA需要这些集合类型参数

<bean id="classa" class="com.xt.ClassA">
    <property name="myList"> 
        <list>
            <value>A</value>
            <value>B</value>
            <value>C</value>
        </list>
    </property>
    <property name="myMap1">
        <map>
            <entry key="key1" value="val1"/>
            <entry key="key2" value="val2"/>
        </map>
    </property>
    <property name="myProp">
        <props>
            <prop key="key1">val1</prop>
            <prop key="key2">val2</prop>
        </props>
    </property>
</bean>

 

2. 基于java配置类显示配置

 

3. 隐性的bean发现机制和自动装配

  spring容器可在不使用 <constructor-arg>、<property>元素的情况下自动装配相互协作的bean之间的关系   

  <bean>的autowire属性:

    no:默认,没有自动装配,需要显式指定

    byName:根据属性名装配

    byType:根据数据类型装配;如果存在多个匹配的类型,则出错 

    constructor:类似byType,此类型仅适用于构造函数参数类型,若容器中没有一个构造函数参数类型的bean,则出错

    autodetect:spring首先尝试通过constructor使用自动装配连接,如果不行,则尝试通过byType

3. 自动装配

    组件扫描:spring框架自动发现应用上下文中创建的bean

    自动装配:spring框架自动满足bean之间的依赖

 3.1

  需要加入 spring-aop.jar

  修改bean.xml文件为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>

 3.2

  注解:

  3.2.1 用于创建对象的

  注解的效果相当于<bean id="xxx" class="xxx" />

(1)@Component  表明这个类是一个组件类,告知spring为这个类创建bean

  属性:

    value:指定bean的id。不指定的id默认为当前类的类名,首字母小写

 

  相应的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.xt.abc.impl"> </context:component-scan>

</beans>

  <context:component-scan>标签:配置spring创建容器时要扫描的包

  类的定义:

@Component(value = "classA")
public class ClassA {
    private Date date;
    public void fun(){
        System.out.println("classa test2");
    }
}

  这个类在该标签指定的包下,当 getBean("classA")时即可获取ClassA类对象

  

 

(2)@Controller、@Service、@Repository

  Controller一般用于表现层的注解;Service一般用在业务层;Repository用于持久层

  这三个的作用和属性和Component是一样的

 

 

  4.2 用于注入数据的

  注解的效果相当于 <property name="xx" ref="xxx" />

(1)@Autowired

  自动按类型注入。此注解只能注入其它bean类型。当容器中有唯一的一个bean对象,其类型与变量的类型匹配,则可以成功注入。

  此注解放在成员上,则可以省略setter方法

  如果容器里有多个和此变量类型匹配的bean对象,则 变量名字 和 bean对象在容器的key(即bean的id)进行匹配,有相同的则也可以成功注入。

 

(2)@Qualifier

  属性:  value 为指定bean的id

  在自动按照类型注入的基础上,再安装bean的id注入。注入字段时要配合Autowire一起使用;给方法参数注入时,可以独立使用 

 

(3)@Resource

  属性:name  指定bean的id

  直接按bean的id注入

(4)@Value

  属性:value 指定值(可使用spring的el表达式)

  注入基本类型数据和String类型

 

  4.3 用于改变作用范围的

  相当于 <bean id="xx" class="xxx"  scope="xxxxx">

(1)@Scope

  属性:value  指定范围取值

  

  4.4 初始化、销毁方法

  相当于<bean id="xx" class="xx" init-method="xx"  destroy-method="xxx">

(1)@PostConstruct

  指定初始化方法

(2)@PreDestroy

  指定销毁方法

 

 

5. 新注解

(1)@Configuration

  表示这个类是一个配置类

  相对应的,获取容器中的对象之前,要使用 AnnotationApplocationContext(xxx.class) 而不是ClassPathXmlApplicationContext("xxx.xml")

@Configuration
public class AppConfig{
    @Bean
    public MyService myService1(){
        return new MyServiceImpl1();
    }
    @Bean
    public MyService myService2(){
        return new MyServiceImpl2();
    }
}

 

 等效于:

<beans>
<bean id="myService1" class="com.xt.services.MyServiceImpl1" />
<bean id="myService2" class="com.xt.services.MyServiceImpl2" />
</beans>

 

  使用:

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
MyService1 service1 = ctx.getBean(MyService1.class);
MyService2 service2 = ctx.getBean(MyService2.class);

 

(2)@ComponentScan

  通过注解指定spring创建容器时要扫描的包,相当于 xml 中的 basePackages

 

(3)@Bean

  属性: name 给当前方法创建的对象指定名称,即bean的id(默认值为方法名)

  方法注解,表面使用此方法创建一个对象,并且放入spring容器

 

(4)@PropertySource

  属性:value[]   指定properties文件位置;在类路径下要写 classpath:

  用于加载properties文件中的配置

 

(5)@Import

  从另一个配置类中加载 @Bean 定义

 

 

 

 

 

-----------------------------------------------------------------------------------------------------------

    通过依赖注入DI:相互协作完成功能的各个组件之间松散耦合

    AOP:各种功能分离形成可重用的组件

posted @ 2020-11-24 16:22  T,X  阅读(154)  评论(0)    收藏  举报