Spring框架概述
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性。
功能:使用基本的javaBean来代替EJB,并提供了更多功能。
范围:所有java应用,不局限于服务端开发。
简述:spring是一个轻量级控制反转和面向切面的框架。
IoC(控制反转)
IoC概述
Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
简单来说:A对象依赖B对象,以前的话我们需要在A对象中去主动new一个B对象,IoC改变了这种方式,A对象在初始化时,其所依赖的B对象由Spring容器创建。
代码示例
目录结构
User
applicationContext.xml
UserTest
测试结果
IoC创建对象的几种方式
1.无参数构造器创建
2.有参数构造器创建
1)通过参数下标传递参数的方式
2)通过参数名称传递参数的方式
3)通过参数类型传递参数的方式
User.java
applicationContext.xml
UserTest
运行结果
Spring的配置
1.bean的别名配置
1)alias标签
2)bean标签中的name属性
2.import标签:将多个配置文件的信息导入到一个配置文件
目录结构
applicationContext.xml
beans1.xml
beans2.xml
UserTest.java
测试结果
DI(依赖注入)
简单来说:将IoC容器中的对象动态注入到某个对象中,就比如上面提到的A对象和B对象,Spring容器将创建好的B对象注入到A对象中,来满足A对象对B对象的依赖。
1.Set注入
Person.java
applicationContext.xml
toString输出
2.有参数构造器注入
参考IoC通过有参数构造器创建对象的三种方式
将User实体类的有参构造器改为如下:
3.拓展方式注入
1.p命名空间:适用于set注入
导入约束
xmlns:p="http://www.springframework.org/schema/p"
2.c命名空间:使用与有参构造器注入
导入约束
xmlns:c="http://www.springframework.org/schema/c"
Bean的作用域
1.singleton:单例 每次从容器中获取到的都是同一个对象
2.prototype:原型 每次从容器中获取到的都不是同一个对象
3.request:作用域为web应用的一次请求
4.session:作用域为web应用的一次回话
5.application:作用域为web应用全局
Bean的自动装配
1.在xml中自动装配
1.通过byName
注意:
2.通过byType
注意
2.使用注解进行自动装配
1.开启注解支持
<context:annotation-config/>
2.注解的作用
@Autowired:现根据bean的类型进行查找注入,若只有一个该类型bean直接注入,若有多个找bean名称一致的进行注入。
@Qualifier:当有多个相同类型的bean,且bean名称都不匹配的,@Autowired可与该注解结合使用,在该注解value属性中输入要注入bean的名称来配合@Autowired进行bean的注入。
@Resources:其功能相当于@Autowired+@Qualifier的功能
3.@Autowired与@Resources的区别
@Autowired:先byType再byName
@Resources:先byName再byType
Spring注解开发
1.开启注解扫描
2.@Component
3.@Value:值类型注入
4.衍生的注解
注:以下注解与@Component注解功能相同
@Repository:对应三层的dao层
@Service:对应三层中的service层
@Controller:对应三层的Controller层
5.作用域注解@Scope
AOP(面向切面编程)
AOP概念
与OOP对比,AOP是处理一些横切行问题。这些横切性问题不会影响到主逻辑的实现,但是会散落到代码的各个部分,难以维护。AOP就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的目的。对主业务逻辑进行一些横向的拓展。
AspectJ 中必须要了解的概念:
Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point:表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut:表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
AOP 帮助我们解决了新的问题没有?
AOP 并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法,能够用更少的工作量来解决现有的一些问题,并且使得系统更加健壮,可维护性更好。同时,它让我们在进行系统架构和模块设计的时候多了新的选择和新的思路。
AOP的三种实现方式
方式一:Advice的类实现Spring提供的接口
1.程序目录
2.Log
3.UserServiceImpl
4.applicationContext.xml
5.测试类及其结果
方式二:xml配置
1.LogTwo
2.applicationContext.xml
3.测试类及其结果
方式三:注解实现
1.LogThree
2.applicationContext.xml
3.测试类及其结果