1.Helloworld
利用配置文件(Bean.xml)进行类的配置,利用全类名进行反射的方式进行类的创建
ApplicationContext ctx =new ClassPathXmlApplicationContext("Beans.xml");类路径下的配置文件
其中,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注入
字面值:可用字符串表示的值,可以通过
-构造方法注入:通过构造器注入,可指定参数的位置和类型,以区分重载的构造器
2.6引用其他的类
-以通过 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
-也可以 在属性或构造器里包含 Bean 的声明, 这样的 Bean称为内部 Bean.不用写id,其他都一样,不能够被外部引用,只能在内部使用。
2.7为级联属性赋值
属性需先初始化才可以进行赋值,否则异常
2.8集合属性
在 Spring中可以通过一组内置的 xml 标签(例如: ,
-配置单例的集合bean,以供多个bean进行引用,利用ref=cars可以引用
2.9 p空间
3.自动装配
4.Bean 之间的关系
继承配置bean:子bean从父bean中继承配置,也可覆盖配置
抽象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
不用配置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:指定路径的资源
子节点:
组件装配:
@Autowired 注解自动装配 具有兼容类型的单个 Bean属性
默认情况下, 所有使用@Authwired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置@ Authwired 注解的 required 属性为 false。
当 IOC 容器里存在多个类型兼容的 Bean 时
1.可通过value设置为接口名,自动装配该实现类
2.@Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @ Qualifiter 已指定注入 Bean 的名称
12.泛型依赖注入
类中包含接口,通过泛型的类型寻找具有同样泛型类型的实现类
13.AOP 面向切面编程
1.XML文件配置,使注解起作用
2.切面:
@Component:把类放入IOC容器中
@Aspect:定义为切面
@Before("execution(public * com.aop.helloworld.*.*(..))")
AspectJ 支持 5 种类型的通知注解:
– @Before: 前置通知, 在方法执行之前执行
– @After: 后置通知, 在方法执行之后执行,不能访问返回结果
– @ AfterRunning: 返回通知, 在方法返回结果之后执行
– @ AfterThrowing: 异常通知, 在方法抛出异常之后
– @Around: 环绕通知, 围绕着方法执行
环绕通知:
1.需要携带ProceedingJoinPoint类型参数
2.必须有返回值,返回值即为目标方法的返回值
切面优先级:
@Order(数值,值越小,优先级越高)
13.2 声明切入点表达式
@Pointcut("execution(public * com.aop.helloworld.*.*(..))")
public void declareJoinPointExpression(){}
@Before("declareJoinPointExpression()")其他通知直接使用方法名来引用切入点表达式
优点:便于修改切入点表达式
14.Spring 对Jdbc的使用
配置c3p0数据源
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)事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源(秒为单位)