spring开发步骤
准备:
1.https://repo.spring.io/ui/
2.artifactory--->artfacts--->plugins-release--->org----->springframework--->spring选择需要的版本下载即可
或者直接进入这个网址https://repo.spring.io/ui/native/plugins-release/org/springframework/spring/
1.spring项目至少需要5jar
spring-aop.jar 开发aop特性需要的jar
spring-beans.jar 处理bean的jar
spring-context.jar 处理spring上下文的jar
spring-core.jar spring核心jar
spring-expression.jar spring表达式
三方提供的r日志.jar
commons-logging.jar 日志
2.编写配置文件
为编写时有一些提示,自动生成一些配置信息,可以给eclipse增加,支持spring的插件:spring tool suite,
安装步骤:
1.先去market搜索 spring tool suite
2.安装图片中的2个插件
3.新建bean configuration--->applicationContext.xml
4.开发spring程序(IOC)
5.创建学生类Student
6.在applicationContext.xml配置对象
7.在测试类中通过调用new ClassPathXmlApplicationContext("applicationContext.xml")获取该对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student student = (Student) context.getBean("student"); System.out.println(student);
可以发现spriing帮忙我new了对象,并且帮我们给对象赋值
8.IOC(控制反转)也可以称为DI(依赖注入)
控制反转:将创建对象,属性值的方式进行了犯罪,从new,setXxx(翻转为从springIOC容器getBean()
依赖注入:将属性值注入给了属性,将属性注入给了bean,将bean注入给了ioc容器
总结:ioc/di,无论需要什么对象,都可以直接去springioc容器中获取,而不需要自己操作(new\setXxxx())
因此之后的ioc分为二步:
1.先给springioc中存放对象并赋值
2.拿对象
IOC容器赋值:如果是简单类型(8个基本+String),value;如果是对象类型,ref="需要引用的id值",因此实现了对象与对象之间的依赖注入
set方法依赖注入:
赋值:默认使用的是set方法();
依赖注入的底层是通过反射来实现的
依赖注入3种方式
1.set注入
赋值,默认使用的是set方法()
依赖注入底层是通过放射实现的
下面的例子是通set方式注入的:
<property>关键字
2构造器注入:通过构造方法实现注入
<constructor>
注意:如果<constructor-arg>的顺序与构造器方法参数不一致,需要通过type或者index或者name来指定
3.p命名空间
简答类型:
p:属性名="属性值"
引用类型(除了String外)
P:属性名-ref="引用的id"
注意:
1.多个p赋值之间,要留空格
2.无论是String还是Int/short/long,在赋值时都是value="值",因此建议此种情况,需要配合其他name\type进行区分
示例:注入各种输数据类型list,set,map,properties
set,list,数组,各自有自己的标签<set> <list> <array>,但是也可以混着用
给对象类型赋值null:
<property name=""name">
<null/>
</property>
赋空值:
<property name="name">
<value></value>
</property>
在ioc中定义bean的前提:该bean的类必须提供了无参构造
自动装配:(只使用与ref类型)
约定优于配置
<bean .... class="类路径" autowire="byName">
bean的id值=类的属性名
byName:自动寻找,其它bean的id值=该Course类的属性名
byType:其它bean的类型(class)是否与该Course类的ref属性类型一直(注意:此种方式必须满足:当前ioc容器只能有一个bean满足)
constructor:其它bean的类型(class)是否与该Course类的构造方法参数的类型一致,此种方式的本质就是byType
可以在头文件中,一次性将ioc容器的所有bean,设置为自动装配
自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要谨慎
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-autowire="byName" >
使用注解定义bean;通过注解的方式,将bean以及相应的属性值放入ioc容器
1.在applicationConfiguration.xml配置扫描器,先要加上头
1>
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xs
2>配置扫描器
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd" default-autowire="byName" > <!-- 配置扫描器 --> <context:component-scan base-package="类路径1,类路径2,类路径3,"></context:component-scan>在启动的时候,会根据base-package该包中所有类
3.在需要扫描的类上面加上@Component("bean的id")注解
Component细化:
DAO层注解:@Repository
service层注解:@Service
controller层注解:@Controller
使用注解实现事务(生命式事务)
目标:通过事务使以下方法要么全成功,要么全失败
public void addStudent(){
//增加班级
//增加学生
//crud
}
a>jar
spring-tx-4.3.9.RELEASE
ojdbc.jar
commons-dbcp.jar连接池使用到的数据源
commons-pool.jar 连接池
spring-jdbc-4.3.0.RC2.jar数据库驱动
aopalliance.jar
b>在applicationConfiguration.xml配置数据库相关
jdbc\mybatis\spring
增加事务tx的命名空间
<!--增加对事务的支持-->
<tx:annotation-driven Transaction-manager="txManager">
c.使用
将需要称为的事务的方法前增加注解
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
aop编程:
一个普通类------->有特定功能的类
a,继承类
b.实现接口
c.加个注解
d.配置
把类变成----通知
实现接口
前置通知实现步骤:
1>jar
aopliance.jar
aspectjweaver.jar
2>配置
将业务类,通知纳入springIOC容器
定义切入点(一端),定义通知类(另一端),通过pointcut-ref将两端连接起来
3>编写代码
aop:每当之前add()之前,自动执行一个方法log()
add():业务方法
log():自动执行的通知,即aop前置通知
如果出现异常:类似java.lang.NoClassDefoundError,就是缺少jar包或者jar包错了
异常通知:
根据异常通知接口的定义可以发现,异常通知的实现类必须编写一下方法:
public void afterThrowing([Method,args,target,ThrowableSubclass])
a>public void afterThrowing(Method,args,target,ThrowablesSubclass)
b>public void afterThrowing(ThrowableSubclass)
环绕通知:在目标方法的前后,异常发生时,最终等各个地方都可以进行的通知.他是最强大的一个通知.9可以获取目标方法的全部控制权(目标方法是否执行,执行之前,执行之后,参数,返回值等)
在使用环绕通知时,目标方法的一切信息都可以通过invocation拿到
二:实现注解实现通知:
1>jar
与实现接口方式需要的包是一样的
2>配置
1>将业务类,通知纳入springIOC容器
2>开启注解
在applicationContext.xml
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
3>编写
定义切入点(一端),定义通知类(另一端),通过pointcut-ref将两端连接起来
通知类的实现:
@Aspect //声明该类是通知类 public class LogBeforeAnnotation{ @Before("切入点类路径.方法名")//声明这个方法是一个前置通知方法,里面的属性定义切点 public void myBefore(){ System.out.println("注解形式-前置通知") } @AfterReturning("企鹅额议案类路径.方法名") public void myAfter(){ System.out.println("注解形式-前置通知") } }
3>将通知类纳入springIOC容器
在类前面加上@Component()
@Component("Bean的id")//将LogBeforeAnnotation类纳入springIOC容器
@Aspect //声明该类是通知类 public class LogBeforeAnnotation{ @Before("切入点类路径.方法名")//声明这个方法是一个前置通知方法,里面的属性定义切点 public void myBefore(){ System.out.println("注解形式-前置通知") } @AfterReturning("企鹅额议案类路径.方法名") public void myAfter(){ System.out.println("注解形式-前置通知") } }
注意:通过注解形式将对象增加到IOCrongqi 需要增加扫描器和开启注解
增加扫描器,开启注解,但是开启注解需要扫描器
<context:component-scan base-package="org.lanqiao.aop"></context:component-scan>
扫描器会将制定的包中的@Component @Service@Respository @Controller 修饰的类产生的对象,增加到IOC容器中
//开启注解对aop的支持 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect不需要加入扫描器,只需要开启即可
通过注解形式实现的aop,如果想获取目标对象的一些参数,则需要使用一个对象,这个对象是固定JoinPoint,是约定的
@Around 环绕通知
@AfterThrowing异常通知
三.通过配置将一个类变为通知类,或者通过配置实现通知类
通过applicationConfiguration.xml里面基于Schema配置,类似与实现接口的方式
接口方式的通知类:public class LogAfter implements AfterReturningAdvice
Schema方式通知:
1>编写一个普通类,public class LogAfter{}
2>将该类通过配资转为一个通知
最终通知也可以单独实现:
@After
public void myAfter("切入点的类路径.方法"){
}
如果要获取目标对象的信息:
注解和Schema: JoinPoint获取
接口:Method method,Object[] args,Object target
schema形式和注解形式相似,不同之处:注解形式使用了@after,schema形式进行了多余的配置
web项目如何初始化SpringIOC容器
当服务启动时候(就是tomcat启动时候)将IOC重启初始化
|
|
|
|
\|/
监听器:监听tomcat是否启动,一旦启动,立刻实例化一个IOC容器对象
这个实例化过程,别人已经写好了,直接用就可以了
在web项目里面可以加载多个配置文件,在web.xml中进行配置
也可以通过通配符指定
Spring整合MyBatis
思路:
SqlSessionFactory-->SqlSession-->StudentMapper--->crud
可以发现,MyBatis最终试试通过SqlSessionFactory操作数据库
spring整合MyBatis其实就是将MyBatis的SqlSessionFactory交给spring
整合步骤:
1.jar包
mybatis-spring.jar专门用于2者的整合
spring-tx.jar
spring-jdbc.jar
spring-expression.jar
spring-context-support.jar
spring-core.jar
spring-context.jar
spring-beans.jar
spring-aop.jar
spring-web.jar
commons-logging.jaar
commons-dbcp.jar
ojdbc.jar
mybatis.jar
log4.jar
commons-pool.jar
2.类和表
3.Mybatis配置文件
4.通过mapper.xml将类表建立起映射关系
5.
之前:conf.xml--->SqlSessionFactory
现在整合的时候,需要通过Spring管理SqlSessionFactory,因此产生SqlSessionFactory所需要的数据库信息,不在放入conf.xml
而需要放入spring配置文件中applicationContext.xml进行数据源的配置
配置Spring配置文件(ApplicationContext.xml)
6.使用Spring-MyBatis整合产物
目标:通过spring产生mybatis最终需要的动态mapper对象studentMapper对象
spring产生动态mapper对象,有3种方法:
1>DAO层实现类,集成SqlSessionDaoSupport类---->就会产生一个SqlSessionFactory对象
2>就是省略掉第一种方式的实现类
直接使用Mybatis提供Mapper实现类:org.mybatis.spring.mapper.MapperFactoryBean
缺点:每个mapper都需要配置一次
3>第三种方式
批量配置实现类(批量产生多个mapper)
批量产生Mapper对在SpringIOC中的id值默认就是接口名
Spring Ioc容器:
xml配置文件:applicationContext.xml
存bean: <bean id class>
取bean:
获取IOC容器: ApplicationContext context=new ClassPathXMLApplicationContext("applicationContext.xml")
获取bean context.getBean("bean的id")
注解:@Configuration,配置类就是ioc容器
注意:xml配置文件和配置类2种形式的ioc是独立的,就是有2个ioc容器,各自是各自的,要一个ioc是对的,如果是2个就是有问题的
ioc容器功能:
bean就是数据的载体
1>存数据bean
@Bean+方法的返回值
2>取数据bean
获取IOC容器: ApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class)
获取bean context.getBean("bean的id")
注解形式给IOC容器中存放Bean:
1.必须有@Configuration注解(配置类)
2.形式:
三层组件加入IOC容器:需要给各类加注解,扫描器识别注解所在包(@Controller,@Service,@Repository(DAO)):
步骤:
1>给三层组件分别加注解(@Controller,@Service,@Repository---->@component)
2>将注解所在的包纳入ioc扫描器ComponentScan()
纳入扫描器有2种方法:
a>xml配置文件:
<context:Component-scan base-package="包的路径"> </context:componet-scan>
逻辑:在三层类上加注解,让ioc能够识别,扫描器
b>注解方式:
可以给扫描器指定规则:
过滤类型:FilterType(ANNOTATION,ASSIGNABLE_TYPE,CUSTOM)
ANNOTATION:三层注解类型@Controller,@Service,@Repository->@Component
@Bean+方法返回值