Spring 中有一个核心容器,这个容器我们通常称之为IOC(Inversion of Control)容器,这个容器最核心功能就是控制反转.这个容器负责对象的创建,对象的存储(map),对象的管理(依赖查找,依赖注入)。
核心服务(整合资源)
核心特性 (IOC-面向对象,AOP-面向切面,Cloud-面向微服务)
xml配置bean对象,把HelloService交给Spring来管理
<bean id="helloService"
class="beans.HelloService"
scope="prototype"
init-method="init"
destroy-method="destory"/>
在Spring容器中管理的Bean对象,可以在声明时通过scope属性或
1) singleton (这个作用域标识的对象具备全局唯一性):系统默认
2) prototype(这个作用域标识的对象每次获取都会创建新的对象)
1) singleton作用域的对象可以在容器关闭时销毁(会调用对象的销毁资源的方法)
2) prototype作用域的对象可以由容器创建对象,初始化对象,但不负责销毁.
1) lazy-init: 应用在bean标签中用于指定这个bean的加载策略.
2) default-lazy-init:应用在beans标签中用于指定所有bean的加载策略.
通过set属性赋值
<bean id="dataSource" class="beans.OpenDataSource">
<property name="driverClassName" value="com.jdbc.mysql.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
通过构造方法为属性赋值
<bean id="openDataSource02" class="beans.OpenDataSource">
<!-- 默认按照构造方法参数顺序注入值
说明:配置时有几个constructor-arg就是
要调用带及格参数的构造函数
-->
<constructor-arg value="com.mysql.jdbc.Driver"/>
<constructor-arg value="jdbc:mysql:///test"/>
<constructor-arg value="root"/>
<constructor-arg value="123456"/>
</bean>
如果注入值是提取文件中的属性可以用 #{文件名.属性}
<property name="password" value="#{cfg.password}"/>
Spring 配置文件中为对象属性注入值。
<bean id="collection" class="beans.CollectionObject">
<property name="list">
<list>
<value>A</value>
<value>B</value>
</list>
</property>
<property name="map">
<map>
<entry key="k1" value="100" />
<entry key="k2" value="300" />
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
1) 修饰Bean对象的注解。(xml中描述bean使用<bean>)
a) @Configuration(描述Bean为一个配置对象)
b) @Component(描述Bean为一个一般组件组件)
c) @Controller(描述Bean为一个控制层对象)
d) @Service (描述Bean为一个业务层对象)
e) @Respository(描述Bean为一个持久层对象)
f) @Scope(描述bean的作用域)
g) @Lazy(定义bean对象是否延迟加载)
1) 指定Bean生命周期方法 (xml中使用<bean init-method=””>)
a) @ PostConstruct(描述生命周期开始要调用的初始化的方法)
b) @ PreDestroy (描述生命周期结束时要调用的销毁的方法)
说明:描述生命周期方法的注解应用时应在JDK1.7以上版本
2) 自动装配注解(为属性注入值):类似xml阶段中bean标签的autowire属性
a) @Autowire (一般修饰构造方法或set方法或属性,默认按类型装配)
b) @Qualifier (配合Autowire注解,按名字进行装配,尤其是出类型相同的bean时,可以指定具体bean)
c) @Resource (一般修饰set方法或属性,默认按名字装配)
Spring AOP
切面(aspect): 横切面对象,一般为一个具体类对象(可以借助@Aspect声明)
连接点(joinpoint):程序执行过程中某个特定的点,一般指被拦截到的的方法
切入点(pointcut):对连接点拦截内容的一种定义,一般可以理解为多个连接点的结合.
通知(Advice):在切面的某个特定连接点上执行的动作(扩展功能),例如around,before,after等
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
Spring AOP的实现依托于Aspect框架(AOP框架)
所以要引用1.8.5有问题 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
关于aop切面的配置
<bean id="helloService"
class="spring.beans.HelloServiceImpl"/>
<!-- 配置非核心业务对象(日志处理对象):切面 -->
<bean id="log"
class="spring.aop.LoggingAspect"/>
<!-- AOP配置(切入点,切面) -->
<aop:config>
<!-- 配置切入点(bean,@annotation,within) -->
<aop:pointcut
expression="within(spring.beans.HelloServiceImpl)"
id="logPointCut"/>
<!-- 配置日志处理 -->
<aop:aspect ref="log" >
<aop:before method="beforeMethod"
pointcut-ref="logPointCut"/>
<aop:after method="afterMethod"
pointcut-ref="logPointCut"/>
</aop:aspect>
</aop:config>
</beans>
Spring事务
Spring提供了两种事务管理方式, 编程式事务和声明式事务。
事务四大特性:ACID(
1) 原型子型(一个事务中的多个操作要么都成功要么都失败)
2) 一致性(例如存钱操作,存之前和存之前的钱数应该是一致的)
3) 隔离性(事务与事务应该是相互隔离的)
4) 持久性(事务一旦提交,数据要持久保存)
Step1:在spring配置文件中启用事务注解
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--设置注解驱动的事务管理 -->
<tx:annotation-driven transaction-manager="txManager"/>
Step2:在类或方法中使用@Transaction注解应用事务。