Spring是分层的javaSE以及javaEE应用于全栈轻量级开源框架,以IOC和AOP作为框架核心,提供表现层springmvc和持久层springJDBC以及业务层事务管理以及众多模块的企业应用级技术,还能整合开源世界众多的著名的第三方框架.
本质就是创建对象和维护对象之间的关系
Spring Framework 系统架构
1.IOC
1.1:控制反转(对象创建的控制权由程序转到外部)
将对象的创建,对象的存储,对象的管理都交给spring框架处理
IOC容器负责创建对象,初始化 这些被创建的被成为 bean
1.2 :解决代码耦合性
2.DI
依赖注入就是在创建的对象的同时或者之后,对对象的属性进行赋值
3.案例
3.1架包准备
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cyc</groupId>
<artifactId>mavenSpring</artifactId>
<version>1.0-SNAPSHOT</version>
<!--准备spring的架包-->
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
</project>
3.2User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer user_id;
private String user_name;
private String gender;
private Integer age;
}
3.3配置文件
<?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:配置一个bean对象,将对象交给IOC进行管理
id:唯一标识,不能重复
class:设置bean对象所对应的类型-->
<bean id="helloworld" class="com.chen.pojo.HelloWorld"></bean>
<!-- <bean id="User1" class="com.chen.pojo.User"></bean>-->
</beans>
3.4获取bean的三种方式
/*
* 1.根据bean的id获取
* 2.通过类型进行获取[用的最多]
* 注意 获取bean类型时,要求ioc容器中有且只有一个匹配类型的bean
* 若没有一个匹配类型的bean则抛出异常NoSuchBeanDefinitionException
* 若有多给匹配类型的bean则抛出异常 NoUniqueBeanDefinitionException
*3.根据id和类型获取
* 总结:根据类型获取bean时,满足bean唯一性的情况下 即通过bean的类型,bean继承的类的类型,bean实现的接口的类型都可以获取bean
@Test
public void test(){
//获取ioc容器
ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取容器中的对象 为调用对象中的方法做准备
//根据bean的id获取
// HelloWorld helloworld = (HelloWorld) ioc.getBean("helloworld");
// helloworld.say();
//通过类型进行获取
User user = ioc.getBean(User.class);
//根据id和类型获取
// User user = ioc.getBean("User", User.class);
System.out.println(user);
}
当程序运行时,spring开始工作,会加载整个xml配合配置文件,读到<bean>,获取class属性中的类的全路径,再基于反射创建该类的对象
3.5依赖注入(IOC的具体实现)
set注入
<!--property:通过成员变量的set方法进行赋值
name:设置需要赋值的属性名(和set方法有关,get和set方法去掉get set 之后首字母小写)
value:设定指定的值
-->
<bean id="User" class="com.chen.pojo.User">
<property name="user_id" value="1001"></property>
<property name="user_name" value="cyc"></property>
<property name="gender" value="男"></property>
<property name="age" value="20"></property>
</bean>
构造器注入
<bean id="User" class="com.chen.pojo.User">
<!-- 当只有一个有参构造时,name可以省略-->
<!-- 多个有参构造时,通过name进行指定-->
<constructor-arg value="1001"></constructor-arg>
<constructor-arg value="cyc"></constructor-arg>
<constructor-arg value="男"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
</bean>
特殊字符处理
赋值为空值
<property name="age"> <null></null> </property>
<<
>>
<property name="gender" > <value><![CDATA[<男>]]></value> </property>
CDATA当中的内容会原样解析 是xml中的特殊标签 只能写在标签中