Spring基础(imooc)

Spring基础

Keywords

控制反转IOC:程序员不自己去new实例,而是交由Spring去构建实例,并且统一放在IOC容器当中由Spring进行管理。

依赖注入DI:即注入,由Spring将构建出的实例注入到需要使用这个对象的类当中。

要让实例被构建并被交给Spring的IOC容器统一管理的几种实现方式:(大序号表示实例的构建方式,小序号代表bean的注入方式)

一、Spring注入方式:通过在xml当中定义bean,并且配置加载ApplicationsContext的方式,分为两种,在xml当中定义了bean元素,并在其中设置了id属性以及class属性。

a)         在使用到这个bean的类中加入同名属性,并且写出setter方法。

b)         在使用这个bean的类中加入同名属性,并且在这个类的构造器当中,有对这个属性的赋值操作

二、采用注解方式与自动扫描:例如直接在java代码当中使用SpringMVC框架下的:@Component元注解或者其定义的三大注解 @Service(用于Service层) @Controller(用于Controller类) @Repository(用于Dao层),之后不需要在xml当中显式的配置bean了,直接配置一个扫描,Spring会自动去构建这些类的实例

a)         使用@Autowired注解,直接从IOC容器当中拿到实例,@Autowired使用的三种方式

                         i.              在成员变量上

                       ii.              在setter函数上,函数内部对成员变量赋值

                      iii.              在构造器上使用,构造器对成员变量赋值

b)         @Required只能放在setter上

c)         @Resource注解:使用规则基本上与@Autowired相同,@Resource 注解的特点是根据bean的id进行匹配,而@Autowired可以根据bean的类型进行匹配,详见第12点

三、注解方式:避免繁琐的XML配置,直接在java代码当中使用注解。包括@Configuration @Bean @Import @DependsOn。@Bean通常搭配@Configuration使用,等价于XML当中的bean元素与beans元素的配置项,代码如下

此时如果没有指定@Bean的name属性,则默认是函数名为这个bean的id

配置文件的引入,引入主要分为了在xml中定义bean的方式和在java代码中使用注解,详见第10点

1 内容梗概

Spring框架图

核心容器:

Bean 

Core核心包和工具 

Context上下文        

SpEL (Spring表达式)

2 框架

3 接口、IOC容器

接口的概念

一个例子,Junit测试

4 IOC容器的初始化

IOC容器的初始化:ApplicationContext本身就是保存bean对象的容器,故容器本身的初始化,就是通过一系列的配置,将ApplicationContext进行初始化。

而配置ApplicationContext有三种方式:

一、使用classpath

二、使用本地文件系统中某个文件地址

三、(SpringMVC)web应用中用servlet类或者Listener类来初始化IOC容器

5 XML中定义Bean的注入与在XML当中自动装配

即容器在启动后会开始加载bean的配置,并完成bean的初始化。当bean被构建出来之后,将这些bean赋值到需要使用到的类当中去,这个过程就是注入 。

常用的两种注入方式详解:

设值注入:此时在InjectionServiceImpl这个类当中,必须有属性 injectionDAO ,同时也要有该属性的set方法,此时这个XML做的事情是创建一个InjectionDAOImpl类的对象并通过set赋值给injectionDAO属性

必须在InjectionServiceImpl当中有一个injectionDAO的属性

并且通过InjectionServiceImpl的构造器,进行InjectionDAO类型的赋值,将这个对象赋值给属性injectionDAO

 

自动装配

 

即在beans元素当中添加一个属性,default-autowire=”byName”。此时就不用在bean的定义当中定义嵌套加入property这个元素了,所有的嵌套bean加在将会自动完成

 

 

自动装配的几种方式

6 Resources(针对资源文件的统一接口)

ResourceLoader


所有的 ApplicationContext都实现了 ResourceLoader 接口,故只要获取到一个ApplicationContext体系的类就可以使用这个 getResource()这个函数了

使用getResource函数时的几种前缀

这里,直接实现 ApplicationContextAware接口,这里面有 ApplicationContext的setter函数,所以可以直接注入 ApplicationContext的对象 applicationContext,可以用它来调用getResource()函数

以上就是通过 aware接口来调用 getResource() 函数的方法

7 使用注解方式来构建Bean

jdk1.5之后,使用注解可以将Bean注入到上下文的IOC容器中

Spring下将Bean注入到容器中:

@Service  @Repository  @Controller

以上三种都是由元注解@Component定义得到的,放在类之上

而@Autowired则是放在类的内部的属性之上,表示从IOC容器中获取到注入的Bean,并使用

基础典型配置

自动检测时的配置

Spring下,annotation-config 和 component-scan的不同:

先说,annotation-config的工作模式:其本身是不管类的注入的,即使用者需要首先通过某种方式将类注入到IOC容器当中(例如使用XML配置的方式,或者其他注入方式)。之后使用这个配置,对已经注入的Bean进行下一步的管理,用于“激活”Bean,让已经注入了的Bean开始工作

而说到component-scan的工作方式,其本身有着和annotation-config一样的作用,同时它还需要扫描指定包下的类,看是否存在由元注解 @Component定义的类,如果有,则将其也同时注入到IOC容器当中

搭配过滤器使用扫描

Bean的作用域(Scope)

1.singleton单例模式,

  全局有且仅有一个实例

2.prototype原型模式,

  每次获取Bean的时候会有一个新的实例

3.request

request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效

 

8 Autowired注解

Autowired比Required更常用

特点:既可以用在成员变量上;又可以用在set函数上

@Autowired使用的三种方式:

1 放在成员变量上,直接注入

2 成员先声明,之后设置一个set函数,在set函数上使用@Autowired

3 在构造器内,对成员变量赋值,并且在构造器上用@Autowired进行定义

除了常见的Component元注解定义的三种注解外,其他的接口也可以通过注解的方式定义

对于接口类型,其实现类如果被@Component等关键字定义之后,则此时,如果存在接口本身的一个集合类,则会顺序注入该接口所有实现类的对象。List和Map皆是

如果需要顺序,则还可在实现类上采用关键字@Order进行注入,规定实现类对象被注入的顺序,例如

@Order(1)

@Order(2)

9 @Bean注解的使用

bean的名称=@Bean去注入的方法的名称

即,此时的bean的name为:myService

.

10 配置文件的引入

XML中定义bean的方式

 

java代码中使用注解的方式

使用@Configuration注解,将ConfigFile构建为bean

此时,只需要在xml的配置中指明 properties 静态文件的位置即可

使用 @ImportResource和@Value注解进行资源文件读取,注解方式

一个小坑:注意在使用@Value注入值的时候,如果是@Value(“${username}”),此时取的是当前操作系统的操作者名。为了区分所以一般使用@Value(“${jdbc.username}”)

11 @Bean和@Scope

12 @Resource与@Autowired

@Resource 和@Autowired都可以写在setter上或者写在字段上

二者不同之处在于:

l  @Autowired属于Spring,默认按照类型装配

l  @Resource属于J2EE,按照名称进行装配

按照名称查找和通过类型查找的不同点

private UserDao userdao

名称查找:通过该userdao属性名称在容器中查找id为userdao的bean

类型查找:在容器中查找类型为UserDao类型的bean的实体

@Resource注解在字段上和在setter函数上的注入规则

1 @Resource()在字段上:

  1. 先使用字段名匹配到bean,查找到bean则注入,类型不匹配则报异常,注入失败
  2. 如果字段名没有匹配到bean,则Spring会尝试采用字段类型匹配,找到则进行注入,但是,可能由于字段类型是一个接口,此时会有多个匹配,返回多个bean的异常,注入失败

2 @Resource在setter上

  1. 同样还是先使用属性名字进行bean的匹配,查找到bean则注入,如果类型不匹配则此时有异常,注入失败
  2. 这一点有所不同,如果属性名没有匹配到bean,则Spring采用类型匹配,但是此时根据的是属性名入参的类型,找到bean则进行注入。同理,如果本身是接口类型,则可能找到多个匹配,此时直接返回多个bean的异常,注入失败

private UserDao userdao

@Resource

private void setUserDao(Dao dao){

         this.userdao=dao;

}

此时,首先查找是否存在名字为userdao的bean;如果没有,则继续查找IOC容器中是否存在类型为Dao的bean,而并不是属性本身的类型

13 Aware

Aware的方式是如果你的类中需要Spring框架本身的一些资源,这时你肯定不能够自己去初始化那些资源然后通过属性注入或者构造器注入的方式进行依赖注入,所以Spring提供了这种方式由Spring框架为你注入

Spring提供各种Aware接口。常见的有:

BeanFactoryAware

BeanNameAware

ApplicationContextAware

BeanClassLoaderAware

Spring AOP

1 概念

穿插在各个子功能模块当中的切面,在修改代码时,不需要深入到各个模块中修改源码,省事

2 基于aspect配置的切面

3 切入点pointcut

申明pointcut

执行所有的方法

单一的方法匹配

4 advice 通知的应用

通知的配置

前置通知

后置通知

throwing指定可被传递的异常属性的参数名

最终通知

5 Introductions应用

将切面定义一个父类接口,并且配置该实现类

6 Advisor

7 AOP API

Pointcut的实现类之一

afterthrowing 和 after只能执行一个

afterreturning一般是方法结束前的最后一行代码,无论方法是否正常结束,无论是否抛出异常都会执行after当中的代码

 所有基于配置文件的aspect只支持单例模式

原文地址:https://www.cnblogs.com/aguai1992/p/9341199.html