spring
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 --拦截对业务层或数据层的请求的