13.1依赖注入
定义:所谓依赖注入指的是容器负责创建对象和维护对象之间的依赖关系。
依赖注入的目的主要是为了解耦。
Spring IoC容器负责创建Bean,并通过容器将功能类Bean注入到所需要的Bean中。
Spring提供使用xml、注解、Java配置(配置元数据)、groovy配置实现Bean的创建和注入。
Spring容器解析这些配置元数据进行Bean初始化、配置和管理依赖。
声明Bean的注解:
@Component组件,没有明确的角色。
@Service在业务逻辑层(service层)使用。
@Repository在数据访问层(dao层)使用。
@Controller在展现层(MVC->Spring MVC)使用。
注入Bean的注解:
@Autowired:Spring提供的注解。
@Inject: JSR-330提供的注解。
@Resource:JSR-250提供的注解。
@Autowired、@Inject、@Resource可注解在属性或者set方法上,但注解在属性上可使代码更少,层次更清晰。
配置类的声明:
@Configuration声明当前类是一个配置类。
@ComponentScan(“.....包名”):自动扫描包名下所有使用@Component、@Service、@Repository、@Controller的类,并注册为Bean。
1.3.2 Java配置
解释:Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置,Java配置也是SpringBoot推荐的配置方式。
Java配置是通过@Configuration和@Bean来实现的:
@Configuration:声明当前类是一个配置类,相当于一个Spring配置的xml文件。意味这个类里有0个或多个@Bean注解。(若所需的Bean都在此类中,就没必要使用包扫描)
@Bean:注解在方法上,声明当前方法的返回值是一个Bean。
在Spring容器中,只要容器中存在某个Bean,就可以在另外一个Bean的声明方法的参数中注入。
1.3.3 AOP(面向切面编程)
Spring的AOP存在的目的就是为了解耦。
AOP可以使一组类共享相同的行为。
Spring支持AspectJ的注解式切面编程:
- 使用@Aspect声明是一个切面。
- 使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
- 拦截规则为切点(PiontCut),为了使切点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Around的参数中调用。
- 其中符合条件的每一个被拦截处为连接点(JoinPoint)。
2.1 Bean的Scope
Scope是用来描述Spring容器如何新建Bean的实例的。
Spring的Scope有以下几种,通过@Scope注解来实现:
- Singleton: 一个Spring容器中只有一个Bean的实例,全容器共享一个实例。(默认配置/单例模式)
- Prototype:每次调用新建一个Bean的实例。(多例模式)
- Request:Web项目中,给每一个http request新建一个Bean实例。(一次http请求内有效)
- Session:Web项目中,给每一个http Session新建一个Bean实例。(一个用户