Spring介绍
- 简介:
Spring框架由于软件开发的复杂性而创建的。spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 - 优点:
Spring是一个开源的免费的框架(容器)
Spring是一个轻量级的、非侵入式的框架
控制反转(IOC),面向切面编程(AOP)
支持事务的处理,对框架整合的支持
Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架 - 官方文档介绍
Spring官方文档 - Spring结构组成
IOC
- 三种注入方式
- set方法注入
把需要的注入的类写成属性,给他设置一个set方法。
接着在配置文件中类A注入到类B里面去public class B{ public void setA(A a){ this.a = a; } }
<bean id="aa" class="com.kr.sys.A"></bean> <bean id="bb" class="com.kr.sys.B"> <property name="a" ref="aa"></property> </bean>
- 构造器注入
同set方法注入一样,首先把需要注入的类写成属性,然后使用构造方法。
接着在配置文件public class B{ private A a; public B(A a){ this.a = a; } }
<bean id="aa" class="com.kr.sys.A"></bean> <bean id="bb" class="com.kr.sys.B"> <constructor-arg name="a" ref="aa"></constructor-arg> </bean>
- 注解注入
- set方法注入
- Bean
- id = 变量名
- class = new 的对象
- property 相当于给对象中的属性设置一个值
- value 具体的值,基本数据类型
- 引用Spring容器中创建好的对象
- alias 给bean中的id或者name取别名
- p命名空间注入,可以直接注入属性的值:property
- c命名空间注入,通过构造器注入:construct-args
- Bean六种作用域
- 单例Singleton
<!-- the following is equivalent, though redundant (singleton scope is the default) -->
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
- 原型Prototype
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
- request、session、application(只能在web开发中使用到)
Bean的自动装配
- 自动装配是Spring满足bean依赖一种方式
- Spring会在上下文中自动寻找,并自动给bean装配属性
spring三种装配的方式
- 在xml中显示的配置
- 在Java中显示配置
- 隐式的自动装配*
隐式的自动装配
-
byName:会自动在容器上下文查找,和自己对象set方法后面的值对应的beanid
byName后面必须接上类型class -
byType:会自动在容器上下文查找,和自己对象属性类型相同的bean
byType可以忽略掉id -
注解自动装配
- 使用注解前提:
- 导入约束
- 配置注解的支持
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
Spring注解开发
一、注解自动装配
-
@Autowired(自动装配通过类型,名字)
- @Autowired(required = false):对象可以为null
- @Autowired(required = true):对象不允许为空
- 如果Autowired不能唯一自动配置上属性则需要@Qualifier(value = “cat”):指定注入bean id为cat,要配合@Autowired
-
@Nullable:字段标记了这个注解,说明这个字段可以为null;
-
@Resource(name = “cat”):可以通过byName的方式实现,如果找不到则可以通过byType实现,可以直接指定寻找bean id为cat
二、扫描包
<context:component-scan base-package="com.kuang.pojo"/>
指定要扫描的包这个包下的注解就会生效
- @Nullable:字段标记了这个注解,说明这个字段可以为null
- @Component:组件,放在类上,说明这个类被Spring管理了,就是bean
- 衍生的注解:
- dao【@Repository】
- service【@Service】
- controller【@Controller】
这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean。
三、作用域注解
@Scope("singleton")
- 该注解的默认值,表示这个bean在spring容器中是单例的,我们通过spring容器获取这个bean的时候,都是对一个对象进行操作
@Scope("prototype")
- 表示这个bean在容器中不是单例的,每次通过spring容器获取到的实例都是一个新的实例。因为每次都会产生一个新的实例,所以这个值要注意新建对象的开销。
@Scope("request")
- 表示这个bean在每一次的http request中是单例的,也就是说不同的http请求中的bean都是不同的实例。这个值需要spring是在web应用中的。
@Scope(“session”)
- 表示这个bean在每一次的http session中是单例的,也就是说不同的http会话中的bean都是不同的实例。这个值需要spring是在web应用中的。
@Scope(“global session”)
- 表示这个bean在全局http session中是单例的,也就是说在全局会话中的bean是同一个实例。这个值需要spring是在web应用中的。
小结
xml与注解
- xml更加万能,适用于任何场合,维护简单方便
- 注解不是自己类使用不了,维护相对复杂
xml与注解最佳实践
- xml用来管理bean
- 注解只负责完成属性的注入
Java配置类
- 上面的配置类和下面的bean配置效果是一样的,所以现在可以完全不使用Spring的xml配置,全权交给Java来做。
- JavaConfig是Spring 的一个子项目,在Spring4之后,它成为了一个核心功能。
@Configuration
这个也会被Spring容器托管,注册到容器中,因为它本来就是一个@Component
有@Configuration注解的类代表这是一个配置类,就和我们之前看的beans.xml是一样的@ComponentScan("要扫描的包")
主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中。