1.Spring(大杂烩)
总结:spring是一个轻量级的控制反转(IOC,Inversion Of Control)和面向切面编程(AOP,Aspect Oriented Programing)的框架。
理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
优点:·spring是一个开源的免费的框架(容器)!
·spring是一个轻量级的、非侵入式(导入不会破坏原来代码功能)的框架!
·控制反转(IOC)、面向切面编程(AOP)
·支持事务的处理,对框架整合的支持。
弊端:发展了太久之后,违背了原来的理念!配置十分繁琐,人称:“配置地狱!”.
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式 。
核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
2.IOC(Inversion Of Control)
具体案例:https://blog.csdn.net/qq_33369905/article/details/106647330?spm=1001.2014.3001.5501
(1)理论
思想:以前所有对象都是由开发程序的程序员用具体明确地代码去进行控制创建 , 而IOC是由调用程序员自行控制创建对象 , 把主动权交给了调用程序员 。调用程序员不用去管怎么创建,怎么实现了 , 只负责提供一个接口 。它一种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。系统耦合性大大降低,可以更加专注于业务的实现。
所谓IOC,就是对象由Spring创建、管理、装配。
IOC是Spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IOC。
IOC容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。.
控制反转IOC(Inversion Of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法。控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring IOC容器来创建的
反转 : 程序本身不创建对象 , 而变成被动的接收对象 .
依赖注入 : 就是利用set方法来进行注入来创建对象的.
IOC是一种编程思想,由主动的编程变成被动的接收。
(2)第一个Spring
实体类:
package cn.qqa.pojo;
public class Hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "Hello{" +
"str='" + str + '\'' +
'}';
}
}
配置文件:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd" >
<!--使用SPring来创建对象,在Spring这些都称为Bean
bean = 对象 ===》 new Hello
类型 变量名 = new 类型();
Hello hello = new Hello();
id = 变量名
class = new的对象;
property 相当于给对象中的属性设置一个值
-->
<!--注意: 这里的name并不是属性 , 而是set方法后面的那部分 , 首字母小写-->
<!--如果引用另外一个bean , 不是用value 而是用 ref-->
<bean id="hello" class="cn.qqa.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
(3)IOC创建对象的方式
1、User.java
package cn.qqa.pojo;
public class User {
private String name;
public User() {
System.out.println("User 的无参构造");
}
public User(String name) {
this.name = name;
System.out.println("User 的有参构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
2、beans.xml
(1)无参构造
<bean id="user1" class="cn.qqa.pojo.User">
<property name="name" value="wxy"/>
</bean>
(2)有参构造(3种方式)
1.下标赋值
<bean id="user" class="cn.qqa.pojo.User">
<!--使用构造参数解析的方式1:下标赋值-->
<constructor-arg index="0" value="xxx"/>
</bean>
2.类型赋值
<!--方式2:使用类型-->
<constructor-arg type="java.lang.String" value="xxx"/>
3.参数名
<!--方式3:直接通过参数名来设置-->
<constructor-arg name="name" value="wxy"/>
<bean id="user" class="cn.qqa.pojo.User">
<!--使用构造参数解析的方式1:下标赋值-->
<!--<constructor-arg index="0" value="xxx"/>-->
<!--方式2:通过类型创建(不建议)-->
<!--<constructor-arg type="java.lang.String" value="xxx"/>-->
<!--方式3:直接通过参数名来设置-->
<constructor-arg name="name" value="wxy"/>
</bean>
单例模式:可以把IOC容器看做婚介所,类被“注册”后,就会被展示挑选。
注意:在配置文件加载时,容器中管理的对象就已经初始化了!
(4)Spring配置文件
1.alias别名
<!--别名:如果添加了别名,可以用别名取出该对象-->
<alias name="user" alias="userAlias"/>
2.bean
<!--
id:bean的唯一表示符,类比于对象名字
class:bean对象所对应的全限定名(包名+类名)
name:也是别名,而且更高级,可以同时起多个别名,可以用空格、逗号、分号来分隔
-->
3.import
这个import一般用于团队开发使用,可以将多个配置文件导入合并为一个。
假设现在项目中有多个人开发,这两个人负责不同的类开发,不同类注册在不同的xml中,可以利用import将所有人的beans.xml合并为一个总的。使用的时候直接使用总的配置即可。