Spring
-
简介
- spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
- Spring为简化开发而生,让程序员只需关注核心业务的实现,尽可能的不再关注非业务逻辑代码(事务控制,安全日志等)
-
IoC(Inversion of Control)
- 这是一种设计思想,可以降低代码间的耦合度,符合依赖倒置原则
- 核心思想:
- 将对象的创建权交出去
- 将对象和对象之间关系的管理权交出去
- 对象的创建和对象之间关系的维护都由第三方容器来负责
-
DI(Dependency Injection)
- 实现IOC的方式有多种,其中比较重要的是DI(依赖注入)
- 依赖注入用于实现对象之间关系的建立
- 依赖注入的两种方式:
- set注入;执行set方法给属性赋值
- 构造方法注入:执行构造方法给属性赋值
-
spring八大模块:
-
Bean:
-
spring配置文件
-
<?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="userBean" class="com.powernode.spring6.bean.User" /> </beans>
-
id:代表对象的唯一标识,看作一个人的身份证
-
class:指定创建对象的类名(全限定类目)
-
-
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Object userBean = applicationContext.getBean("userBean");
-
BeanFactory是Spring容器的超级接口。ApplicationContext是BeanFactory的子接口。
-
spring的ioc容器底层实际上使用了工厂模式
-
spring是通过调用类的无参数构造方法来创建对象的,所以要想让spring给你创建对象,必须保证无参数构造方法是存在的。
-
spring创建对象的原理:
-
// dom4j解析beans.xml文件,从中获取class的全限定类名 // 通过反射机制调用无参数构造方法创建对象 Class clazz = Class.forName("com.powernode.spring6.bean.User"); Object obj = clazz.newInstance();
-
-
Spring底层的IoC实现原理:XML解析+工厂模式+反射机制
-
创建好的对象储存到HashMap中:
- Map<String,Object>
- key是id
- value是bean
-
-
Set注入
-
注入外部Bean:
-
<?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="userDaoBean" class="com.powernode.spring6.dao.UserDao" /> <bean id="userServiceBean" class="com.powernode.spring6.service.UserService"> <property name="userDao" ref="userDaoBean"/> </bean> </beans>
-
bean定义到外面,在property标签中使用ref属性进行注入
-
-
注入内部Bean:
-
<?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="userServiceBean" class="com.powernode.spring6.service.UserService"> <property name="userDao"> <!--在property标签中使用嵌套的bean标签,这就是内部Bean--> <bean class="com.powernode.spring6.dao.UserDao"/> </property> </bean> </beans>
-
-
注入简单类型:
-
package com.powernode.spring6.bean; /** * @author shanglinsong * @version 1.0 * @className com.powernode.spring6.bean.User * @date 2022/11/9 * @since 1.0 */ public class User { private int age; @Override public String toString() { return "User{" + "age=" + age + '}'; } public void setAge(int age) { this.age = age; } }
-
<?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="userBean" class="com.powernode.spring6.bean.User"> <!--<property name="age" value="20"/>--> <property name="age"> <!--如果像这种int类型的属性,我们称为简单类型,这种简单类型在注入的时候要使用value属性,不能使用ref--> <value>20</value> </property> </bean> </beans>
-
注意:如果给简单类型赋值,使用value属性或value标签,而不是ref。
-
通过BeanUtils类源码分析得知,简单类型包括:
- 基本数据类型及其包装类
- String或其他CharSequence子类
- Number子类
- Date子类
- Enum子类
- URL和URI
- Temporal子类
- Local
- Class
-
注入数组k,.
-
数组元素是简单类型
-
package com.powernode.spring6.bean; import java.util.Arrays; public class Person { private String[] favoriteFoods; @Override public String toString() { return "Person{" + "favoriteFoods=" + Arrays.toString(favoriteFoods) + '}'; } public void setFavoriteFoods(String[] favoriteFoods) { this.favoriteFoods = favoriteFoods; } }
-
<?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="personBean" class="com.powernode.spring6.bean.Person"> <property name="favoriteFoods"> <array> <value>鸡排</value> <value>汉堡</value> <value>鹅肝</value> </array> </property> </bean> </beans>
-
-
-
数组元素非简单类型
-
package com.powernode.spring6.bean; public class Goods { private String name; @Override public String toString() { return "Goods{" + "name='" + name + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Goods(String name) { this.name = name; } public Goods() { } }
-
package com.powernode.spring6.bean; import java.util.Arrays; public class Order { // 一个订单中有多个商品 private Goods[] goods; @Override public String toString() { return "Order{" + "goods=" + Arrays.toString(goods) + '}'; } public void setGoods(Goods[] goods) { this.goods = goods; } public Order() { } public Order(Goods[] goods) { this.goods = goods; } }
-
<?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="goodsBean1" class="com.powernode.spring6.bean.Goods"> <property name="name" value="香蕉"/> </bean> <bean id="goodsBean2" class="com.powernode.spring6.bean.Goods"> <property name="name" value="葡萄"/> </bean> <bean id="orderBean" class="com.powernode.spring6.bean.Order"> <property name="goods"> <array> <!--这里使用ref标签即可--> <ref bean="goodsBean1" /> <ref bean="goodsBean2" /> </array> </property> </bean> </beans>
-
-
要点:
- 元素是简单类型,使用value标签
- 元素非简单类型,使用ref标签
-
-
注入List集合
-
list集合:有序可重复
-
package com.powernode.spring6.bean; import java.util.List; public class People { // 一个人有多个名字 private List<String> names; @Override public String toString() { return "People{" + "names=" + names + '}'; } public void setNames(List<String> names) { this.names = names; } }
-
<?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="peopleBean" class="com.powernode.spring6.bean.People"> <property name="names"> <!--list集合有序可重复--> <list> <value>铁锤</value> <value>张三</value> <value>张三</value> <value>张三</value> <value>狼</value> </list> </property> </bean> </beans>
-
注意:注入List集合的时候使用list标签,如果List集合中是简单类型使用value标签,反之使用ref标签。
-
-
注入Set集合
-
Set集合:无序不可重复
-
package com.powernode.spring6.bean; import java.util.List; import java.util.Set; /** */ public class People { // 一个人有多个名字 private List<String> names; // 一个人有多个电话 private Set<String> phones; @Override public String toString() { return "People{" + "names=" + names + ", phones=" + phones + '}'; } public void setPhones(Set<String> phones) { this.phones = phones; } public void setNames(List<String> names) { this.names = names; } }
-
<?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="peopleBean" class="com.powernode.spring6.bean.People"> <property name="names"> <!--list集合有序可重复--> <list> <value>铁锤</value> <value>张三</value> <value>张三</value> <value>张三</value> <value>狼</value> </list> </property> <property name</
-
-