Spring概述1
1 Spring特性:
- 非侵入式
- 依赖注入
- 面向切面编程
- 容器
- 组件化
2 Spring核心jar包:
-
Beans
-
Core
-
Context
-
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容器管理的实体对象
- id:bean对象的唯一实例名,在整个容器中,是不能重复的
- class:指定创建对象的类型,全类名名,就是让spring底层使用反射机制(类必须有空参构造)
- name:指定实体属性名
- 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.