Spring

本文详细介绍了Spring框架的核心概念,包括IOC容器的初始化过程、依赖注入的使用、注解开发的应用以及AOP的代理模式。Spring通过控制反转实现对象的管理,支持XML和注解两种配置方式,并提供了声明式事务管理。同时,文章探讨了SpringBoot和SpringCloud在现代Java开发中的重要性。
摘要由CSDN通过智能技术生成

Spring

  Spring是一个开源的免费的框架(容器),Spring是一个轻量级的、非入侵式的控制反转(IOC)和面向切面编程(AOP)的框架,Spring支持事务的处理,对框架整合的支持。
在这里插入图片描述
在这里插入图片描述
核心容器(Spring Core)
  核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。

应用上下文(Spring Context)
  Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring面向切面编程(Spring AOP)
  通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

JDBC和DAO模块(Spring DAO)
  JDBC、DAO的抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理,和不同数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,并且极大的降低了需要编写的代码数量,比如打开和关闭链接。

对象实体映射(Spring ORM)
  Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有这些都遵从Spring的通用事物和DAO异常层次结构。

Web模块(Spring Web)
  Web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以Spring框架支持与Struts集成,web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

MVC模块(Spring Web MVC)
  MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。MVC容纳了大量视图技术,其中包括JSP、POI等,模型来有JavaBean来构成,存放于m当中,而视图是一个街口,负责实现模型,控制器表示逻辑代码,由c的事情。Spring框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象可以在不同的J2EE环境,独立应用程序和测试环境之间重用。

根据Spring的官网,现代化的Java开发实际上是基于Spring的开发。
在这里插入图片描述
Spring Boot:一个快速开发的脚手架,基于SpringBoot可以快速开发单个微服务
Spring Cloud:基于SpringBoot实现的

IOC理论

IOC本质:
  控制反转IOC是一种设计思想,DI(依赖注入)是实现IOC的一种方法。没有IOC的程序中,使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。所谓的控制反转就是:获得依赖对象的方式反转了。
  IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。
在这里插入图片描述
  采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
  控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

IOC创建对象的方式
1、使用无参构造创建对象,默认
2、使用有参创建对象
通过参数名来设置

<bean id = "user" class = "com.pojo.User">
	<constructor-arg name = "name" value = "java"/>
</bean>

IOC容器的初始化过程

容器的初始化过程主要包括:

  • BeanDefinition的Resource定位
      Resource是Sping中用于封装I/O操作的接口。在创建spring容器时,通常要访问XML配置文件,除此之外还可以通过访问文件类型、二进制流等方式访问资源,还有当需要网络上的资源时可以通过访问URL,Spring把这些文件统称为Resource。
      Spring提供了ResourceLoader接口用于实现不同的Resource加载策略,该接口的实例对象中可以获取一个resource对象,即将不同Resource实例的创建交给ResourceLoader的实现类来处理。ApplicationContext的所有实现类都实现RecourceLoader接口,因此可以直接调用getResource(参数)获取Resoure对象。不同的ApplicatonContext实现类使用getResource方法取得的资源类型不同,例如:FileSystemXmlApplicationContext.getResource获取的就是FileSystemResource实例;ClassPathXmlApplicationContext.gerResource获取的就是ClassPathResource实例;XmlWebApplicationContext.getResource获取的就是ServletContextResource实例。
  • BeanDefinition的载入和解析
      在Spring中配置文件主要格式是XML,对于用来读取XML型资源文件来进行初始化的IoC 容器而言,该类容器会使用到AbstractXmlApplicationContext类,该类定义了一个名为loadBeanDefinitions的方法用于获取BeanDefinition。此方法在具体执行过程中首先会new一个与容器对应的BeanDefinitionReader型实例对象,然后将生成的BeanDefintionReader实例作为参数传入loadBeanDefintions方法,继续往下执行载入BeanDefintion的过程。例如AbstractXmlApplicationContext有两个实现类:FileSystemXmlApplicationContext、ClassPathXmlApplicationContext,这些容器在调用此方法时会创建一个XmlBeanDefinitionReader类对象专门用来载入所有的BeanDefinition。
  • 将BeanDefiniton注册到容器中
      最终Bean配置会被解析成BeanDefinition并与beanName,Alias一同封装到BeanDefinitionHolder类中, 之后调用beanFactory.registerBeanDefinition方法,注册到DefaultListableBeanFactory.beanDefinitionMap中。之后客户端如果要获取Bean对象,Spring容器会根据注册的BeanDefinition信息进行实例化。DefaultListableBeanFactory实现了调用BeanDefinitionRegistry接口的 registerBeanDefinition方法,主要逻辑是向DefaultListableBeanFactory对象的beanDefinitionMap中存放beanDefinition。

Spring配置

1、Bean的配置

<!--
	id : bean的唯一标识符,相当于对象名
	class : bean对象所对应的全限定名 : 报名 + 类型
-->
<bean id = "userT" class = "com.pojo.UserT">
</bean>

2、import
一般用于团队开发使用,可以将多个配置文件导入合并为一个。假设现在项目中有多个人开发,不同人负责不同的类开发,不同的类需要注册在不同的bean中,可以利用import将所有人的beans.xml合并为一个总的applicationContext.xml,使用的时候直接使用总的配置即可。

<import resource = "beans1.xml">
<import resource = "beans2.xml">
<import resource = "beans3.xml">

依赖注入

Set方式注入
依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性由容器来注入

public class Student{
	private String name;
	private Address address;
	private String[] books;
	private List<String> hobbys;
	private Map<String, String> card;
	private Set<String> games;
	private String wife;
	private Properties info;	
}
<bean id = "student" class = "com.pojo.Student">
	<!--普通值注入-->
	<property name = "name" value = "小明">
	
	<!--Bean注入,ref-->
	<property name = "address" value = "address/">
	
	<!--数组注入,ref-->
	<property name = "books">
		<array>
			<value>红楼梦</value>
			<value>西游记</value>
		</array>
	</property>
	
	<!--List注入-->
	<property name = "hobbys">
		<list>
			<value>红楼梦</value>
			<value>西游记</value>
		</list>
	</property>
	
	<!--Map注入-->
	<property name = "card">
		<map>
			<entry key = "身份证" value = "1222323123"/>
			<entry key = "银行卡" value = "1222323123"/>
		</map>
	</property>

	<!--Set注入-->
	<property name = "games">
		<set>
			<value>lol</value>
			<value>冒险岛</value>
		</set>
	</property>
	
	<!--null注入-->
	<property name = "wife">
		<null/>
	</property>

	<!--Property注入-->
	<property name = "info">
		<props>
			<prop key = "学号">"1222323123"</prop>
		</props>
	</property>
</bean>

bean的作用域
在这里插入图片描述
1、单例模式(Spring默认机制)

<bean id = "user" class = "com.pojo.User" scope = "singleton"/>

2、原型模式:每次从容器get的时候,都会产生一个新对象

<bean id = "user" class = "com.pojo.User" scope = "prorotype"/>

3、其余的request、session、application等这些只能在Web开发中用到

bean的自动装配

自动装配是Spring满足bean依赖的一种方式,Spring会在上下文中自动寻找,并自动给bean装配属性。在Spring中有三种装配的方式:
1、在xml中显式配置
2、在java中显式配置
3、隐式地自动装配bean

ByName、ByType自动装配:byName的时候,需要保证所有Bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致。byType的时候,需要保证所有bean的类型唯一,并且这个bean需要和自动注入的属性的类型一致。

<!--byName:会自动在容器上下文中查找和自己对象set方法后面的值对应的beanId>
<!--byType:会自动在容器上下文中查找和自己对象属性类型相同的bean>
<bean id = "people" class = "com.pojo.People" autowire = "byName">
	<property name = "name" value = "小明"/>
</bean>

使用注解实现自动转配
1、导入约束:context约束
2、配置注解的支持:context:annotation-config/
在这里插入图片描述
@Autowired直接在属性上使用即可,也可以在set方法上使用。使用Autowired可以不用编set方法,前提是这个自动装配的属性在IOC(Spring)容器中存在,且符合名字ByName

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,可以使用@Qualifier(value=“xxx”)去配置@Autowired的使用,指定一个唯一的bean对象注入。

public class People {
	@Autowired
	@Qualifier(value = "cat111")
	private Cat cat;

	@Autowired
	@Qualifier(value = "dog222")
	private Dog dog;
}

@Resource注解

public class People {
	@Resource(name = "cat2")
	private Cat cat;

	@Resource
	private Dog dog;
}

@Resource和@Autowired的区别:
1.都是用来自动装配,都可以放在属性字段上
2.@Autowired通过byType的方式实现,而且必须要求这个对象存在
@Resource默认通过byName的方式实现,如果找不到名字,则通过byType实现。如果两个都找不到的情况,就报错。
3.执行顺序不同

使用注解开发

使用注解开发必须保证aop的包导入了,使用注解需要导入context约束,增加注解的支持
在这里插入图片描述
1、bean
2、属性如何注入

@Component
public class User {
	private String name;
	//相当于<property name ="name" value = "小明">
	@Value("小明")
	public void setName() {
		this.name = name;
	}
}

3、衍生的注解
@Component有几个衍生注解,在web开发中,会按照MVC三层架构分层
dao[@Repository] servive[@Service] controller[@Controller],这四个注解功能是一样的,都代表把某个类注册到Spring中,装配Bean
4、自动装配
在这里插入图片描述
5、作用域

@Component
@Scope("prototype")
public class User {
	private String name;
	//相当于<property name ="name" value = "小明">
	@Value("小明")
	public void setName() {
		this.name = name;
	}
}

xml与注解最佳实践:xml用来管理bean;注解只负责完成属性的注入。在使用时需要注意,必须让注解生效,就需要开启注解的支持
在这里插入图片描述

使用Java的方式配置Spring

JavaConfig是Spring的一个子项目,在Spring4之后成为核心功能。
实体类:
在这里插入图片描述
配置文件:
在这里插入图片描述
测试类:
在这里插入图片描述
这种纯Java的配置方式在SpringBoot中随处可见。

代理模式

代理模式是Spring AOP的底层,代理模式的分类:静态代理和动态代理。
静态代理
角色分析:

抽象角色:一般使用接口或者抽象类来解决
真实角色:被代理的角色
代理角色:代理真实角色,之后做一些附属操作
客户:访问代理对象的人

动态代理
动态代理和静态代理角色一样,动态代理的代理类是动态生成的,不是直接写好的。动态代理分为两大类:基于接口的动态代理和基于类的动态代理。

基于接口——JDK动态代理
基于类——cglib
java字节码实现——javasist

需要了解两个类:Proxy(代理)和InvocationHandler(调用)
在这里插入图片描述
在这里插入图片描述
动态代理的好处:
1、可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
2、公共业务交给代理角色,实现了业务的分工
3、公共业务发生扩展的时候,方便集中管理
4、一个动态代理类代理的是一个接口,一般就是对应的一类业务
5、一个动态代理类可以代理多个类,只要是实现了同一个接口即可

AOP

在这里插入图片描述
AOP在Spring中的作用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用Spring实现AOP
在这里插入图片描述
方法一:使用Spring的API接口【主要SpringAPI接口实现】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法二:自定义来实现AOP【主要是切面定义】
在这里插入图片描述
方法三:使用注解实现
在这里插入图片描述
在这里插入图片描述

声明式事务

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值