spring
注意:
部分代码存在乱码问题,直接复制会出现错误!
大二小白一枚,初学java,有任何问题和建议欢迎指教
Spring利用配置文件代替new(IOC):
XML: class内放类路径
java:
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml"); //此处放配置文件路径
User user=context.getBean("user",User.class);
xml文件放入resource文件里!
IOC接口:
IOC思想基础IOC容器完成,IOC容器底层就是对象工厂
Spring提供IOC容器的俩种实现方式:(俩个接口) 都可以通过配置文件获取对象
1.BeanFactory:
IOC容器基本实现,是Spring内部使用的接口,不提供开发人员使用
*加载配置文件的时候不会创建对象,在获取(使用)对象的时候才会创建。
2.ApplicationContext:
BeanFactory的子接口,提供更多强大的功能,一般由开发人员使用
*加载配置文件时就会创建
IOC操作Bean管理:
1.创建对象
2.注入属性(给变量赋初值)
1.基于XML配置文件
创建对象
-
在spring配置文件中,使用bean标签,标签里加对应属性
-
Bean中的标签:(1)id属性:唯一标识 (2)class:类的全路径(包类路径) (3)name:(等同于id)(可以加特殊符号)
-
创建对象时,默认执行无参构造
注入属性
1.DI:依赖注入
~set方法注入属性:(java)中有set方法 <bean id="名字" class="路径"> <!--使用property完成属性注入--> <property name="属性名称" value="对象值"></property> <!--设置空值--> <property name="属性名称" > <null/> </property> <!--属性值有特殊符号--> <property name="属性名称" > <value> <![CDATA[内容]]> </value> </property> </bean> ~有参构造:(java)中有有参构造方法 <bean id="名字" class="路径"> <constructor-arg name="属性名称" value="对象值"></constructor-arg> (name可以用index=“数字”代替,.ex:0为第一个参数,1为第二个参数) </bean> {多个对象多次使用对应标签}
~ p名称空间注入(set注入简化版)
2.内外部bean(一个类中调用另一个类的方法)(类1调用类2)
外部:
<bean id="类1" class="类1路径">
<property name="属性名称" ref="类2id"></property>
</bean>
<bean id="类2" class="类2路径"></bean>
内部:
<bean id="类1" class="类1路径">
<property name="属性名称" >
<bean id="类2" class="类2路径"></bean>
</property>
</bean>
3.注入集合属性(数组,链表)
<bean id="类名" class="类路径">
<property name="数组名称" >
<array>//也可以为<list>
<value>第一个值</value>
<value>第二个值</value>
</array>
</property>
<property name="map名称">
<map>
<entry key="" value=""></entry>
<entry key="" value=""></entry>
</map>
</property>
注入list集合,值是对象
<property name="list名称">
<list>
<ref bean="对象id值"></ref>
</list>
</property>
</bean>
(将属性注入变为公共)(一个数组多个类使用)
IOC操作Bean管理(FactoryBean)
1.普通bean:在配置文件中定义bean的类型就是返回的类型
2.工厂bean:在配置文件中定义的bean类型可以和返回值不同
操作步骤:1.创建类,让这个类作为工厂bean,实现FactoryBean接口
2.实现方法,在实现的方法中定义返回的bean类型
设置单实例或多实例:bean标签里的scope属性:1.默认值,singleton(单实例) 2.prototype (多实例)
初始化方法:bean中的init-method标签,值为初始化方法名称
销毁方法:bean中的destory-method标签,值为销毁方法名称,手动调用close方法
属性自动注入:(之前为手动)bean中的autowire标签,其中byName表示根据属性名称注入(属性名跟id相同),byTpye表示根据 类型(属性类型);(一般用于类与类)
外部属性文件:
1.直接配置数据库信息:
(1)加入jar包
(2)
2.外部属性文件配置数据库连接池:
(1)创建外部属性文件,properties格式文件,写数据库信息
(2)把外部properties文件引入spring配置文件中 :*引入context名称空间
*使用标签引入
2.基于注解方式
注解格式:@注解名称(属性名称=属性值,属性名称=属性值…)
注解可以作用在类,方法,属性上面
spring中创建对象的注解
(1)@Component:普通组件
(2)@Service:用于业务逻辑层(service层)
(3)@Contorller:用于web层
(4)@Repository:用于Dao层和数据持久层
作用都相同!!!!!
spring中运用注解创建对象:
1.引入依赖:Spring-aop-RELEASE.jar
2.开启组件扫描(制定扫描位置):
(1)引入context命名空间(见上)
(2)
<context:component-scan base-package="包名称,包名称"> </context:component-scan>
多个包可以用逗号隔开
use-default-filters="false"表示不使用默认filter,自己配置filter
context:include-filter 设置需要扫描的内容,
context:exclude-filter 设置不需要扫描的内容
此处表示只扫描带Controller注解的类
<context:component-scan base-package="包名称,包名称" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controlle"/>
</context:component-scan>
3.创建类,并在类上添加创建对象注解
4.后续手段如开头java代码
spring中运用注入属性的注解(不需要set方法)
(1)@AutoWired:根据属性类型进行注入
(2)@Qualifier:根据属性名称进行注入,跟(1)一起进行使用,(value=“名称(在类注解中使用value添加的名称)”)
(3)@Resource:俩者皆可 加(name=“”)即为俩者皆可,不加则根据类型注入
(4)@Value:注入普通类型属性 (value=“”)
完全注解开发(不需要配置文件进行配置扫描)
1.创建配置类(代替配置文件)加注解@Configuration–配置类,@ComponentScan(basepacks={“包名 ”})–组件扫描
2.在java中为:
ApplicationContext context=new AnnotationConfigApplicationContext(配置类.class);
User user=context.getBean(“user”,User.class);
AOP
spring框架一般基于AspectJ实现AOP操作
(1)基于xml配置文件
(2)注解
引入aop.jar跟AspectJ.jar依赖
切入点表达式:Execution([权限修饰符(public等)] [返回类型] [类全路径] [方法名称] ([参数列表]))
例如:1.对Dao包中的UserDao中的add方法增强:execution(* Dao.UserDao.add(…))
2.对Dao包中的UserDao中的所有方法增强:execution(* Dao.UserDao.*(…))
2.对Dao包中的所有类中的所有方法增强:execution(* Dao.* .*(…))
术语:
1.连接点:类里面哪些方法可以被增强,这些方法被称为连接点
2.切入点:实际被真正增强的方法,称为切入点
3.通知(增强):实际增强的逻辑部分称为通知(增强)
4.切面:把通知应用的切入点的过程
AspectJ注解
1.创建类,定义方法
2.创建增强类(编写增强逻辑 )
(1)在增强类里创建方法,让不同方法代表不同通知
3.进行通知配置
(1)在spring配置文件中开始注解扫描
(2)使用注解创建俩个类对象
(3)在增强类上加注解@aspect
(4)在spring配置文件中开启生成代理对象:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
4.配置不同类型的通知:@Before @AfterReturning @AfterThrowing @Around
5.相同切入点抽取:创建一个方法加入@Pointcut(Value=切入点表达式),其他类型上的注解直接value=“切入点表达式方法”
6.多个增强类对一个方法进行增强设置优先级:在增强类的上面添加@Order(数字)注解,(数字越小优先级越高)
AspectJ配置文件
1.创建增强类和被增强类,创建方法
2.在spring配置文件中创建俩个类对象
3.在spring文件中配置切入点
<aop:config>
切入点
<aop:pointcut id="切入点名字" expression="切入点表达式(execution)"/>
切面
<aop:asept ref="增强类名">
增强作用在具体方法上
<aop:before method="增强方法名" pointcut-ref="作用到的方法id(切入点id)"/>
</aop:asept>
</aop:config>
完全注解开发(不需要配置文件进行配置扫描)
1.创建配置类(代替配置文件)加注解@Configuration–配置类,@ComponentScan(basepacks={“包名 ”})–开启扫描
@EableAspectJAutoProxy(PpoxyTargetClass = true)–开启生成代理对象
2.在java中为:
ApplicationContext context=new AnnotationConfigApplicationContext(配置类.class);
User user=context.getBean(“user”,User.class);
JdbcTemplate
配置:
配置连接池....
<bean id="名字" class="org.springframework.jdbc.core.JdbcTemple">
<property name="dataSource" ref="连接池id"
</bean>
事务操作
在java中使用数据库操作时,为了防止异常导致数据错误…
编程式事务管理:
声明式事务管理:
1.注解方式:
(1)在spring文件中配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
(2)在spring文件中开启事务注解(引入tx空间)
<tx:annotation-driven transaction-manager="transactionmanager></tx:annotation-driven>"
(3)在service类中(获取servicel类方法上面)添加事务注解:@Transactional
2.参数配置
在@Transactional()中配置相关参数
1:prapagation:事务传播行为:多事务方法(对数据库数据进行变化的操作)直接进行调用,这个过程中事务是如何进行管理的
2:ioslation:事务隔离级别:隔离性:多事务操作之间不会产生影响
3.:timeout:超时时间:事务在一定时间内提交,超时则回滚。默认-1(永不超时)
4.:readOnly:是否可读
5.:rollbackFor:回滚:设置查询哪些异常会进行事务回滚
6.:noRollbackFo:不回滚
完全注解方式:
创建配置类注解加:@Configuration–配置类,@ComponentScan(basepacks={“包名 ”})–开启扫描
@EableTransactionManagement --开始事务
xml方式声明式事务管理
1.配置事务管理器:见注解式中
2.配置通知:
<tx:advice id="txadvice">
<tx:attributes>
指定在哪种规则的方法上面添加事务
<tx:method name="" />
</tx:attributes>
</tx:advice>
3.配置切入点,切面
<aop:config>
切入点
<aop:pointcut id="" express="切入点表达式"/>
切面
<aop:advisor advice-ref="事务id" pointcut-ref="切入点id" />
</aop:config>