1、基本概念
Spring:
- 开源的轻量级的java开发框架,目的是提高开发人员的开发效率以及系统的可维护性。
- 核心功能是支持IOC(控制反转)和AOP(面向切面编程)
- 可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。
- 是很多模块的集合:包括core-container(spring-core、spring-beans)、AOP(spring-aop、spring-aspects)、data access(spring-jdbc、spring-orm)、spring web(spring-web、spring-mvc、spring-websocket)、messaging、spring test
2、IOC
- 思想:IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。
- 具体实现:将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。使用xml或者注解将某类配置为bean,使用@autowired注解就可以实现依赖注入。
(1)IoC 容器:实际上就是个 Map(key,value),Map 中存放的是各种对象。
(2)bean:Bean 代指的就是那些被 IoC 容器所管理的对象。
(3)声明为bean的注解有:
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注。@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。@Controller
: 对应 Spring MVC 控制层,主要用于接受用户请求并调用Service
层返回数据给前端页面。
(4)@Component和@bean的区别:
@Component
注解作用于类,而@Bean
注解作用于方法。@Component
通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用@ComponentScan
注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean
注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean
告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。@Bean
注解比@Component
注解的自定义性更强,而且很多地方我们只能通过@Bean
注解来注册 bean。比如当我们引用第三方库中的类需要装配到Spring
容器时,则只能通过@Bean
来实现。
@Autowired
是 Spring 提供的注解,@Resource
是 JDK 提供的注解。Autowired
默认的注入方式为byType
(根据类型进行匹配),@Resource
默认注入方式为byName
(根据名称进行匹配)。- 当一个接口存在多个实现类的情况下,
@Autowired
和@Resource
都需要通过名称才能正确匹配到对应的 Bean。Autowired
可以通过@Qualifier
注解来显式指定名称,@Resource
可以通过name
属性来显式指定名称
Spring 中 Bean 的作用域通常有下面几种:
- singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
- prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续
getBean()
两次,得到的是不同的 Bean 实例。 - request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
- session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
- application/global-session (仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。
- websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。
3、AOP
- AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑代码(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
- Spring AOP 就是基于动态代理的,如果要代理的对象,要增强某个功能,将增强的逻辑 代码通过切入点织入到目标对象,进而生成代理对象。
- Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。
- Spring AOP 基于动态代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
- AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,
- 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比 Spring AOP 快很多。