Spring 2018-10-11

1.Helloworld

利用配置文件(Bean.xml)进行类的配置,利用全类名进行反射的方式进行类的创建

ApplicationContext ctx =new ClassPathXmlApplicationContext("Beans.xml");类路径下的配置文件

class="com.HelloWorld.HelloWorld">

   

其中,name的值为setProperty中set后面的值,可与具体变量名不同,即setName2设置的是name属性的值。

2.Bean的配置

IOC(Inversion of Control)控制反转:反转资源获取的方向。容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源。

DI(Dependency Injection)依赖注入:组件以一些预先定义好的方式( ( 例如 : setter 方法) ) 接受来自如容器的 资源 注入

2.1 配置bean

class:bean的全类目,通过反射的方式在IOC容器中创建bean,要求bean中必须有无参数的构造器

id:通过id来获取bean的实例,id值唯一

2.2Spring 提供了两种类型的 IOC 容器实现

–  BeanFactory: IOC 容器的基本实现.面向Spring本身,Spring基础设施

–  ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子

接口.几乎所有的应用场合都直接使用。面向使用 Spring 框架的开发

2.3ApplicationContext 代表IOC容器

ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。

实现类:

ClassPathXmlApplicationContext:从类路径下加载xml配置文件

FileSystemXmlApplicationContext: 从文件系统中加载配置文件

2.4获取Bean的方式

-可通过id获取

-可通过类的类型获取,但要求IOC容器中必须只能有一个该类型的Bean

2.5.依赖注入的方式

-属性的注入:通过setter注入

字面值:可用字符串表示的值,可以通过 元素标签或 value 属性进行注入。若字面值中包含特殊字符,可以使用 把字面值包裹起来。

-构造方法注入:通过构造器注入,可指定参数的位置和类型,以区分重载的构造器

2.6引用其他的类

-以通过 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.

-也可以 在属性或构造器里包含 Bean 的声明, 这样的 Bean称为内部 Bean.不用写id,其他都一样,不能够被外部引用,只能在内部使用。

2.7为级联属性赋值

属性需先初始化才可以进行赋值,否则异常

2.8集合属性

在 Spring中可以通过一组内置的 xml 标签(例如: ,) 来配置集合属性.

   

   

        root

-配置单例的集合bean,以供多个bean进行引用,利用ref=cars可以引用

   

2.9 p空间

3.自动装配

4.Bean 之间的关系

继承配置bean:子bean从父bean中继承配置,也可覆盖配置

parent="address">

抽象Bean:只能用来进行继承配置,不能IOC容器被实例化

若class属性没有指定,则必须为抽象bean,必须指定abstract=true

依赖关系:

depends-on=“car,person” 前置依赖car和person的bean,需在本bean实例之前创建好

5.Bean的作用域

singleton:默认,单例,容器初始化时创建实例,整个生命周期内只创建一个

prototype:只有获取实例的时候创建新的实例,容器初始化时不创建

6.使用外部属性文件

导入资源文件

创建外部文件db.properties   文件中内容为:price=test_properties

利用格式调用

7.spel

value=“#{' hhhh '}”

8.IOC容器中Bean的生命周期

Spring IOC 容器对 Bean 的生命周期进行管理的过程:

– 通过构造器或工厂方法创建 Bean 实例

– 为 Bean 的属性设置值和对其他 Bean 的引用

将 Bean 实例传递给 Bean 后置处理器的postProcessBeforeInitialization 方法

–  调用 Bean  的初始化方法

将 Bean 实例传递给 Bean 后置处理器的postProcessAfterInitialization方法

– Bean 可以使用了

–  当容器关闭时,  调用 Bean  的销毁 方法

Bean的后置处理器

类实现BEANPostProcessor接口,并具体提供以下两个方法的实现

返回bean,可在方法中修改方法的bean,该处理器适用于所有的bean

Spring 2018-10-11_第1张图片
init之后和init之前的方法

不用配置id,ioc自动识别

9.通过工厂方法配置Bean
10.通过factoryBean配置Bean

自定义factoryBean需要实现接口

通过factorybean来配置bean的实例,class指向factorybean的全类名

11.配置基于注解的方式

组件扫描(component scanning): Spring 能够从classpath 下自动扫描, 侦测和实例化具有特定注解的组件.

特定组件包括:

– @Component: 基本注解, 标识了一个受 Spring 管理的组件

– @Respository: 标识持久层组件

– @Service: 标识服务层(业务层)组件

– @Controller: 标识表现层组件

对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写.  也可以在注解中通过 value  属性值标识组件的名称。

Spring 的配置文件中声明:

两个属性

base-package:扫描包及子包下的文件

resource-pattern:指定路径的资源

子节点:

指定排除哪些指定表达式的组件

只包含表达式的组件,属性 use-default-filters=false才起作用

组件装配:

@Autowired 注解自动装配 具有兼容类型的单个 Bean属性

默认情况下, 所有使用@Authwired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean  装配属性时,  会抛出异常,  若某一属性允许不被设置,  可以设置@ Authwired 注解的 required  属性为 false。

当 IOC 容器里存在多个类型兼容的 Bean 时

1.可通过value设置为接口名,自动装配该实现类

2.@Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @ Qualifiter 已指定注入 Bean  的名称

12.泛型依赖注入

类中包含接口,通过泛型的类型寻找具有同样泛型类型的实现类

Spring 2018-10-11_第2张图片
同样的

13.AOP 面向切面编程

Spring 2018-10-11_第3张图片
Spring 2018-10-11_第4张图片
joinPoint参数访问到连接细节

1.XML文件配置,使注解起作用

2.切面:

@Component:把类放入IOC容器中

@Aspect:定义为切面

@Before("execution(public * com.aop.helloworld.*.*(..))")

AspectJ 支持 5 种类型的通知注解:

–  @Before: 前置通知, 在方法执行之前执行

–  @After: 后置通知, 在方法执行之后执行,不能访问返回结果

–  @ AfterRunning: 返回通知, 在方法返回结果之后执行

–  @ AfterThrowing: 异常通知, 在方法抛出异常之后

–  @Around: 环绕通知, 围绕着方法执行

返回通知
异常通知

环绕通知:

1.需要携带ProceedingJoinPoint类型参数

2.必须有返回值,返回值即为目标方法的返回值

Spring 2018-10-11_第5张图片
环绕通知

切面优先级:

@Order(数值,值越小,优先级越高)

13.2 声明切入点表达式

@Pointcut("execution(public * com.aop.helloworld.*.*(..))")

public void declareJoinPointExpression(){}

@Before("declareJoinPointExpression()")其他通知直接使用方法名来引用切入点表达式

优点:便于修改切入点表达式

14.Spring 对Jdbc的使用

配置c3p0数据源

   

   

   

   


VALUES(?,?,?)

Spring 2018-10-11_第6张图片

带参数VALUES(:lastName,:email,:dpetId)

Spring 2018-10-11_第7张图片


15.Jdbc中的事务声明

事务:一系列动作,单独的工作单元。要么全部完成,要么都不完成。

-原子性

-一致性

-隔离性

-持久性

   

注解:

@Transactional

事务的传播行为

@Transactional(propagation = Propagation.REQUIRED)

propagation 指定传播行为,默认取值为required,即使用调用方法的事务

事务的隔离级别

@Transactional(isolation = Isolation.DEFAULT)

– 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但 还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.

– 不可重复读:对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.

– 幻读:对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表,就会多出几行.

回滚事务属性

@Transactional(noRollbackFor ={AccountException.class})

默认情况下spring的声明式事务对所有的运行时异常进行回滚

只读属性:

@Transactional(readOnly =true)只读数据不更新数据

超时属性:

@Transactional(timeout =1)事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源(秒为单位)

你可能感兴趣的:(Spring 2018-10-11)