spring框架的定义:
是一个开源的用来简化应用开发的框架
优点:简化开发 -->spring jdbc、管理对象 -->spring容器、集成其他框架
启动spring容器:
1.建项目,导包 pom.xml里搜spring-webmvc > org.springframework spring-webmvc >3.2.8
2.添加配置文件:spring-webmvc.xml
3.启动spring容器
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
创建对象:
方式一:使用无参构造器
1.给类添加无参构造(默认的就行)
2.配置<bean>元素
3.调用容器的getBean方法获取对象,参数id
方式二:使用静态工厂方式创建对象
通过调用类的静态方法来创建对象
factory-method属性:指定一个静态方法
方式三:使用实例工厂方法创建对象
通过调用对象的实例方法来创建对象
factory-bean属性:指定一个bean的id
factory-method属性:指定一个方法
spring容器会调用bean的对应方法来创建对象
作用域:
scope属性值为:prototype,就可以创建多个对象
singleton(单例模式)(默认值)只创建一个对象
声明周期:
创建》
初始化》init-method属性 创建之后立即调用
功能》
销毁》destroy-method属性 关闭容器的时候会先销毁对象,只有作用域为单例时才会执行
延迟加载:
spring容器启动后,会将所有作用域为单例的bean创建好
lazy-init属性:延迟加载
true:创建对象时不调用初始化方法
IOC(Incersion Of Controll 控制反转)
1,IOC定义:对象之间的依赖关系有容器来建立
2. DI定义:(Dependency Injection 依赖注入)
通过调用对象提供的set方法或构造器来建立依赖关系
IOC是目标,DI是手段
3.set 方法注入
配置文件添加bean的子标签<property>它的属性name值是变量名
ref值是被注入bean 的id
4。 构造器方法注入
添加相应的构造器,配置 <constructor-arg> index 属性指定下标0开始 ref同上
5.自动注入(自动装配)@Autowired
spring容器依据某种规则,自动建立对象之间的依赖关系
a.默认情况下,不会自动装配;
b.可以指定autowire属性来告诉容器自动装配(set方法或构造器)
autowire属性值:byName容器依据属性名查找对应的bean调用set注入,找不到为null
byType容器依据属性类型 ,找到多个会保错
constructor 与byType类似,不同的是调用构造器来完成注入
6.注入基本类型的值 》value
<bean id="vb1" class="values.ValueBean">
<property name="name" value="胡八一"></property>
<property name="age" value="30"></property>
</bean>
7.注入集合类型的值 》List 、Set、Map、Properties
<property name="city" >
<list>
<value>北京</value>
<value>上海</value>
<value>广州</value>
<value>重庆</value>
</list>
</property>
<property name="interest">
<set>
<value>放屁</value>
<value>拉屎</value>
</set>
</property>
<property name="score">
<map>
<entry key="english" value="60"/>
<entry key="math" value="80"/>
<entry key="生物" value="90"/>
</map>
</property>
<property name="db">
<props>
<prop key="用户名">刘俊哲</prop>
<prop key="密码">123456</prop>
</props>
</property>
8.引入的方式注入集合类型的值
<util:list id="cityBean">
<value>上海</value>
<value>重庆</value>
</util:list>
<bean id="vb2" class="values.ValueBean">
<property name="city" ref="cityBean"></property>
</bean>
9.读取properties文件内容
读取properties文件的内容
classpath:按照类路径来搜索
location="classpath:****.properties"
spring 容器会依据路径找到文件读取
<util:properties id="config" location="classpath:config.properties"/>
10.使用spring表达式 #{ }
<property name="name" value="#{vb2.name}"></property>
<property name="city" value="#{vb2.city[1]}"></property> :List
<property name="score" value="#{vb2.score['英语']}"></property> :map
<property name="pageSize" value="#{config.pagesize}"></property> :properties文件中的key
使用注解简化配置
1.组件扫描 > spring容器会扫描该包及其子包下的所有类如有注解则将其纳入管理(相当于bean)
1>在类前添加注解 @Component("sb1") bean 缺省情况类名首字母小写
@Scope("prototype")指定作用域 值换成singleton则单例
2> xml文件中配置 > <context:component-scan base-package="annotation"/>
base-package属性:指定要扫描的包名
注解:
@Component 通用注解
@Named 通用注解
@Reposotory 持久化组件注解
@Service 业务层组件注解
@Controller控制层组件注解
特殊注解:
@PostConstruct 初始化注解
@PreDestroy 销毁注解
@lazy 延迟加载
@Scope作用域
依赖注入相关的注解
@Autowired 和 @Qualifier 支持set方式注入和构造器方式注入
1》当采用set方式注入时,将@Autowited添加到set方法前面,不使用@Qualifier的话将使用byType方式
建议使用 @Qualifier 注明要注入的对象名
@Autowired
public void setWt(@Qualifier("wt")Waiter wt) {
System.out.println("setWt()");
this.wt = wt;
}
2》注解加到属性前
@inject / @Named 与上面一致
@Resource 只支持set方法注入
可以添加到set方法前,使用name属性指定要注入的bean的id(否则btType方式)也可以添加到属性前
@Resource(name="wt")
public void setWt(Waiter wt) {
System.out.println("setWt(wt)");
this.wt = wt;
}
@Value注解
可以注入基本类型的值 也可以使用spring表达式 ,加到属性前或加到set方法前
测试方法 :junit.jar
AOP :面向切面(儿) 编程 -->性能审计,异常跟踪,事物处理。
java.long.refl
定义:一个事物的横切面
面向切面编程可以在不改变原有软件的逻辑情况下,为软件添加扩展功能。
1.导包 aspectj aspectjweaver >1.5.4 jar
注:也需要导入spring—aop组件
2.配置文件 spring-aop.xml
<!-- 组件扫描@Componment -->
<context:component-scan base-package="cn.tedu.note.aop"/>
<!-- aspectj 支持@Aspect注解 -->
<aop:aspectj-autoproxy/>
3.在cn.tedu.note.aop包里建java类 类前加注解 @Component @Aspect 表示切面
4.方法前加 @Before("bean(userService)") > org.aspectj.lang.annotation.Before;
切面切人位置为userService的所有方法之前
通知:
声明切面方法的切人位置,相对于被拦截方法的前后位置。
1》@Before 在被拦截的方法之前执行
2》@AfterReturning 在别拦截的方法正常结束后执行
3》@AfterThrowing 在被拦截的方法异常结束时执行
4》@After 在被拦截的方法最终结束后执行,跟异常没关系
5》@Around 环绕通知 可以在底层方法之前和之后
Object obj=joinPoint.proceed();//调用底层业务方法
Signature s=joinPoint.getSignature();//获取方法签名
切入点:
execution : 方法级切入:可以切入到具体方法上
execution(返回值 包名.类名.方法名(参数)) :参数:".." ,返回值:"*",
within : 类级别切入按照类型切入
within(类名表达式) --》cn.tedu.note.aop.PointCutDemo
bean组件切入:切入到bean所有方法
bean(bean组件id)
spring AOP
AspectJ -->Proxy :有接口时反射API的动态代理Proxy
-->CGLIB : 没有接口时使用CGLIB
spring AOP的底层是 基于(JDK反射的)动态代理实现的
案例: 利用一个文件保存所有业务方法的性能(执行消耗时间)
利用AOP拦截所有业务请求
@Around("bena(*Service)")
# spring 事物处理(交易处理)
编码式事物处理:acid四个特性 原子性、一致性、隔离性、持久性
声明式事物处理:无需编码,只需要使用注解声明事物的边界即可。
1.配置文件 必须有spring-jdbc包
<!-- spring配置文件 -->
<!-- 配置声明式事物处理 -->
<!-- 配置事物管理器 -->
<bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 用于驱动@Transactional注解 -->
<tx:annotation-driven transaction-manager="txManger"/>
2. 在方法前添加注解@Transactional(readOnly=true): 只读方法前添加
事务的传播 > @Transactional(propagation=Propagation.REQUIRED)
默认情况下,事务会自动传播:在一个事务方法中调用另一个事务方法,
则自动结合为一个事务!
Propagation.REQUIRED:如果有事务,参与到当前事务,没有的话开启新事务
Propagation.REQUIRES_NEW:必须创建新事务,如果有事务则挂起,开启新事务
Propagation.NEVER :绝不,方法从不参与事务
propagation.NESTED :嵌套,事务必须嵌套到其他事务中
propagation.MANDATORY :不能参与事务,在事务中异常
propagation.SUPPORTED :不支持,可以在事务中调用,但是不参与不支持事务
propagation.SUPPORTS:支持事务,可以在事务中调用,但是单独调用,没有事务保护
事务隔离属性 > @Transactional(isolation=Isolation.SERIALIZABLE)
在软件中大多采用Isolation.READ_COMMITTED 事务隔离级别,可以在并发性能和
隔离安全性之间平衡,是最常用的隔离级别;
Isolation.SERIALIZABLE 是完全串行操作,没有并发,安全性好
Isolation.READ_UNCOMMITTED 完全不隔离,可以完全并发操作,并发性能好,数据安全型差
最佳实践:
1.在业务方法上都使用事务注解
事务注解可以写到类上,这个类方法全部支持事务
2.使用默认的传播属性
3.使用默认的隔离级别
4.对于只读的方法,使用 readOnly=true
》MySQL:MyISAM数据库引擎不支持事务,InnoDB引擎支持数据库事务
初始化spring容器
两种方法:1.DispatchServlet
--只使用spring mvc,则DispatchServlet即可。
2.ContextLoaderListener
--其他情况,就需要使用ContextLoaderListener
如何获取spring bean对象
1.注入bean:当前bean被spring管理的情况下可以使用注入
2.getBean: 当前对象不被spring管理,则需要getBean
WebApplicationContext ctx=
WebApplicationContextUtils.getRequiredWebApplicationContext(cfg.getServletContext());
都是切面编程
spring mvc拦截器
--拦截spring mvc的web url请求
servlet filter
--可以拦截任何的web url 请求
-*.jsp ,*.css,*.html ,*.js,*.png
如:登录以后才能查看图片(防盗链)
spring AOP
--拦截对业务层或数据层的请求的