Spring概述1

1 Spring特性:

  1. 非侵入式
  2. 依赖注入
  3. 面向切面编程
  4. 容器
  5. 组件化

2 Spring核心jar包:

  1. Beans

  2. Core

  3. Context

  4. SpEL

    注意:还需要logging依赖的日志

jar包导入

<properties>
	<spring.version>4.3.18.RELEASE</spring.version>
</properties>
<!--  spring framework begin  -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring.version}</version>
</dependency>
<!--  spring framework end  -->

3 从xml读取配置好的实体类

//创建spring容器对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

//通过容器中管理的对象的id值,获取其中的对象 方法1
//Person person= (Person) context.getBean("person");

// 指定获取对象的类型,到容器中进行唯一匹配  方法2
//Person person = context.getBean( Person.class);

// 指定获取对象的类型,到容器中进行唯一匹配  方法3
Person person = context.getBean("person", Person.class);

4 bean实例(applicationContext.xml)

<bean id="person" class="com.yuyi.spring.beans.Person">
    <property name="name" value="spring"/>
    <!--<property name="name1">
        <value><![CDATA[<abc123&>]]</value>
    </property>-->
</bean>
(1 配置bean:基于xml方式,使用类的全类名
标签:声明一个受spring容器管理的实体对象
  1. id:bean对象的唯一实例名,在整个容器中,是不能重复的
  2. class:指定创建对象的类型,全类名名,就是让spring底层使用反射机制(类必须有空参构造)

:给创建对象的属性赋值

  1. name:指定实体属性名
  2. value:属性值
(2 标签<![CDATA[ ]]

其中可以加任何标签符号,如<![CDATA[<abc123&>]]

5 IOC容器-DI依赖注入

(1 getset依赖注入

<!-- spring依赖注入方式1:setter方法-->
<bean id="car1" class="com.yuyi.spring.di.Car">
    <property name="brand" value="奥迪A4"/>
    <property name="factory" value="一汽"/>
    <property name="price" value="300000.0"/>
</bean>

(2 构造器依赖注入

<bean id="car2" class="com.yuyi.spring.di.Car">
    <constructor-arg value="宝马320"/>
    <constructor-arg value="华晨"/>
    <constructor-arg value="28800.00"/>
</bean>
乱序处理
<!--构造器注入可以通过index指定参数的顺序-->
<bean id="car3" class="com.yuyi.spring.di.Car">
    <constructor-arg value="奔驰C200" index="0"/>
    <constructor-arg value="32000.00" index="2"/>
    <constructor-arg value="北京" index="1"/>
</bean>
类型处理
<!--构造器注入可以通过type指定参数的类型-->
<bean id="car4" class="com.yuyi.spring.di.Car">
    <constructor-arg value="大众迈腾" type="java.lang.String"/>
    <constructor-arg value="一汽" type="java.lang.String"/>
    <constructor-arg value="288000.0" type="java.lang.Double"/>
    <constructor-arg value="轿车" type="java.lang.String"/>
</bean>

(3 p命名空间

<!--p命名空间,给属性赋值-->
<bean id="car5" class="com.yuyi.spring.di.Car"
      p:brand="卡迪拉克CT5" p:factory="上汽" p:price="28000.0" p:type="轿车"></bean>

(4 外部bean

<!--引入外部bean对象,主要是针对实体属性,不能直接使用value,直接使用ref管理外部bean对象-->
<bean id="teacher1" class="com.yuyi.spring.di.Teacher">
    <property name="name" value="谢群"/>
    <property name="duty" value="班主任"/>
    <property name="car" ref="car1"/>
</bean>

(5 内部bean

<!--使用内部bean,只能内部使用,其他地方都访问不了-->
<bean id="teacher2" class="com.yuyi.spring.di.Teacher">
    <property name="name" value="李苏杰"/>
    <property name="duty" value="班主任"/>
    <property name="car">
        <bean class="com.yuyi.spring.di.Car">
            <property name="brand" value="阿斯顿马丁"/>
            <property name="factory" value="意大利"/>
            <property name="price" value="1880000.0"/>
        </bean>
    </property>
</bean>

(6 集合属性注入List

<!-- 集合属性注入,list -->
<bean id="teacherList" class="com.yuyi.spring.di.TeacherList">
    <property name="name" value="杨茜茜"/>
    <property name="duty" value="经理"/>
    <property name="carList">
        <list>
            <ref bean="car2"/>
            <ref bean="car3"/>
            <ref bean="car4"/>
        </list>
    </property>
</bean>

(7 集合属性注入Map

<!-- 集合属性注入,map -->
<bean id="teacherMap" class="com.yuyi.spring.di.TeacherMap">
    <property name="name" value="万千"/>
    <property name="duty" value="班主任"/>
    <property name="carMap">
        <map>
            <entry key="小黄" value-ref="car4"/>
            <entry key="小黑" value-ref="car5"/>
        </map>
    </property>
</bean>

6 工厂bean

(1 自定义类实现FactoryBean接口,泛型中指定返回值类型

package com.yuyi.spring.di;

import org.springframework.beans.factory.FactoryBean;

/**
 * Created on 2021/6/16.
 * <p>
 * Author: Lcywings
 * <p>
 * Description:
 */
public class MyFactoryBean implements FactoryBean<Car> {

    /**
     * 如果在spring容器中,创建了工厂bean的实例对象,其返回的不是当前类的实例,而是其getObject返回的对象
     *
     * @return
     * @throws Exception
     */
    @Override
    public Car getObject() throws Exception {
        // 可以增加业务逻辑对象,方便开发人员参与到spring底层创建实例对象的过程中去
        System.out.println("执行了getObject对象,返回实例对象");
        return new Car("林肯领航员", "美国", 500000.0);
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        // 指定创建对象是单例的还是多例的
        return false;
    }
}

2)xml中声明工厂bean,其中什么也不写

<!--创建工厂bean对象-->
<bean id="myFactoryBean" class="com.yuyi.spring.di.MyFactoryBean">
</bean>

7 bean的作用域

​ 使用scope属性设置是否单例

单例

<!-- 单例:singleton,这个是springbean的默认作用域,可以不写
        在整IOC容器中,他的实例对象是唯一的(只有一个,每次通过geiBean反复获取的都是同一个对象),
        创建时机:容器初始化时,就创建该实例,放入容器中,后续每次调用直接从容器中获取。
-->
<bean id="car1" class="com.yuyi.spring.scope.Car" scope="singleton">
    <property name="brand" value="奥迪A6"/>
    <property name="factory" value="一汽"/>
    <property name="price" value="400000.0"/>
</bean>

多例

<!-- 多例:prototype,这个不是springbean的默认作用域,必须手动指定
      在整IOC容器中,他的实例对象可以是多个(每次通过geiBean方法获取的都会重新创建一个对象),
      创建时机:容器初始化时,不会创建该实例,后续每次调用才会创建实例对象并返回,即每次都是新的对象。
 -->
<bean id="car2" class="com.yuyi.spring.scope.Car" scope="prototype">
    <property name="brand" value="宝马525"/>
    <property name="factory" value="华晨"/>
    <property name="price" value="380000.0"/>
</bean>

8 builder注解的用法

package com.yuyi.spring.beans;

import lombok.Builder;
import lombok.Data;

/**
 * Created on 2021/6/16.
 * <p>
 * Author: Lcywings
 * <p>
 * Description:builder注解用法
 */
@Data
@Builder(toBuilder = true)
public class User {

    private String userName;

    private String userPwd;

    public static void main(String[] args) {

        User user = User.builder().userName("admin").userPwd("123").build();
        System.out.println(user);

        user = user.toBuilder().userName("admin1").userPwd("456").build();
        System.out.println(user);

    }
}

​ 使代码简洁,书写流畅,显得十分高级

Q.E.D.