1.Helloworld
利用配置文件(Bean.xml)进行类的配置,利用全类名进行反射的方式进行类的创建
ApplicationContext ctx =new ClassPathXmlApplicationContext("Beans.xml");类路径下的配置文件
<bean id="helloworld" class="com.HelloWorld.HelloWorld">
<property name="name2" value ="Spring">
</bean>
其中,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注入
<property name="name2" value ="Spring"></property>
字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。
-构造方法注入:通过构造器注入,可指定参数的位置和类型,以区分重载的构造器
<constructor-arg value="audi" index="0"/type="java.lang.String"></constructor-arg>
2.6引用其他的类
-以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
<ref bean="car2"><property name="" ref="car2">
-也可以 在属性或构造器里包含 Bean 的声明, 这样的 Bean称为内部 Bean.不用写id,其他都一样,不能够被外部引用,只能在内部使用。
2.7为级联属性赋值
属性需先初始化才可以进行赋值,否则异常
<property name ="car.maxspeed" value=""></property>
2.8集合属性
在 Spring中可以通过一组内置的 xml 标签(例如: <list>,<set> 或 <map>) 来配置集合属性.
</list>
<ref bean="car">
<ref bean="car">
</list>
<map>
<entry key="aa" value-ref="car"></entry>
<entry key="bb" value-ref="car2"></entry>
</map>
<property name="properties">
<prop key="name">root</prop>
</property>
-配置单例的集合bean,以供多个bean进行引用,利用ref=cars可以引用
<util:list id="cars">
<ref bean="car">
</util:list>
2.9 p空间
<bean id="person3" class="com.collection.Person" p:age="30" p:name="hahaha" p:cars-ref="cars">
3.自动装配
<bean id="person" class="com.autowire.Person" autowire="byName" p:name="hahaha"></bean>
4.Bean 之间的关系
继承配置bean:子bean从父bean中继承配置,也可覆盖配置
<bean id="address2" p:street="lanbailou" parent="address"></bean>
抽象Bean:只能用来进行继承配置,不能IOC容器被实例化
<bean id="address" class="com.autowire.Address" abstract="true"></bean>
若class属性没有指定,则必须为抽象bean,必须指定abstract=true
依赖关系:
depends-on=“car,person” 前置依赖car和person的bean,需在本bean实例之前创建好
5.Bean的作用域
<bean id="car" class="Car" p:brand="brand" scope="prototype"></bean>
singleton:默认,单例,容器初始化时创建实例,整个生命周期内只创建一个
prototype:只有获取实例的时候创建新的实例,容器初始化时不创建
6.使用外部属性文件
<context:property-placeholder location="classpath:db.properties"/>导入资源文件
创建外部文件db.properties 文件中内容为:price=test_properties
利用<property name="brand" value="${price}"></property>格式调用
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自动识别
<bean class="BeanPostProcessor"></bean>
9.通过工厂方法配置Bean
10.通过factoryBean配置Bean
自定义factoryBean需要实现接口
通过factorybean来配置bean的实例,class指向factorybean的全类名
11.配置基于注解的方式
组件扫描(component scanning): Spring 能够从classpath 下自动扫描, 侦测和实例化具有特定注解的组件.
• 特定组件包括:
– @Component: 基本注解, 标识了一个受 Spring 管理的组件
– @Respository: 标识持久层组件
– @Service: 标识服务层(业务层)组件
– @Controller: 标识表现层组件
对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称。
Spring 的配置文件中声明:
<context:component-scan base-package="com.annotation" resource-pattern="repository/*.class"></context:component-scan>
两个属性:
base-package:扫描包及子包下的文件
resource-pattern:指定路径的资源
子节点:
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"></context:exclude-filter>指定排除哪些指定表达式的组件
<context:include-filter type="assignable" expression="接口名(不包含接口和接口所有实现类)"></context:include-filter>只包含表达式的组件,属性 use-default-filters=false才起作用
组件装配:
@Autowired 注解自动装配 具有兼容类型的单个 Bean属性
默认情况下, 所有使用@Authwired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置@ Authwired 注解的 required 属性为 false。
当 IOC 容器里存在多个类型兼容的 Bean 时
1.可通过value设置为接口名,自动装配该实现类
2.@Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @ Qualifiter 已指定注入 Bean 的名称
12.泛型依赖注入
类中包含接口,通过泛型的类型寻找具有同样泛型类型的实现类
13.AOP 面向切面编程
1.XML文件配置,使注解起作用
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
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数据源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/>VALUES(?,?,?)
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"<constructor-arg ref="dataSource"/>带参数VALUES(:lastName,:email,:dpetId)
15.Jdbc中的事务声明
事务:一系列动作,单独的工作单元。要么全部完成,要么都不完成。
-原子性
-一致性
-隔离性
-持久性
<!--配置事务管理器管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">
<!--启用事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
注解:
@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)事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源(秒为单位)