IOC
传统创建类的方式 java类---->new java()
Spring方式:加载application.xml文件,ApplicationContext ap = new ClassPathXmlApplicationContext("*****");,把需要加载的bean预置到了ap容器内,使用ap.getBean(); 指定bean来创建,可以批量产生,完成对java类进行管理
关于其中创建的bean种类:lazy-init懒加载、scope="prototype"多例模式,种类很多,可以到官网看看
- 配置方式:
关于bean的创建方式:我个人常用的两种(前两个 构造注入 set注入)
构造注入
<bean id="user" class="com.ius.demo.entity.User" scope="prototype">
<constructor-arg index="0"><value>110</value></constructor-arg>
<constructor-arg index="1"><value>bob</value></constructor-arg>
</bean>
set注入 需要 user中有set方法
<bean id="user1" class="com.ius.demo.entity.User" scope="prototype">
<property name="uid" >
<value>9527</value>
</property>
<property name="name" >
<value>唐伯虎</value>
</property>
</bean>
比较不常用 list、set、map注入方式
<bean id="user1" class="com.ius.demo.entity.User" scope="prototype">
<property name="uid" >
<value>9527</value>
</property>
<property name="name" >
<value>唐伯虎</value>
</property>
<property name="tels">
<array>
<value>110</value>
<value>120</value>
<value>122</value>
</array>
</property>
<property name="address">
<list>
<value>沈阳1套</value>
<value>北京2套</value>
<value>广州1套</value>
</list>
</property>
<property name="childs">
<set>
<value>大毛</value>
<value>二毛</value>
<value>大毛</value>
</set>
</property>
<property name="citys">
<map>
<entry key="sy" value="沈阳"></entry>
<entry key="dl" value="大连"></entry>
<entry key="tl" value="铁岭"></entry>
</map>
</property>
<property name="account">
<props>
<prop key="user">tom</prop>
<prop key="pass">123</prop>
</props>
</property>
</bean>
</beans>
- 注解方式
导入对应jar包,在xml配置到,让spring容器去扫描注解
<context:component-scan base-package=“com.ius”></context:component-scan>
自动装配@Autowire、@Resource
类上 @Component@Service、@Controller …
AOP
面向切面编程
分析一下AOP:Java是一个OOP语言,AOP就是对OOP对扩展,其实就是对原来方法的增强,但是我们有两种方式增强
- 继承
继承后的方法和原方法之间耦合比较多 - 装饰模式
常见的在IO部分,但是明显导致代码越来越负责了
所以我们比较常用AOP
一些比较官方的解释
Aspect:切面 – 封装共同业务逻辑,用该切面类实现的对象,我们称之为切面对象
JoinPoint:连接点 – 在目标类中加入共同业务的位置,在连接点中一般封装方法信息(被切入方法),表示哪些方法需要切入共同逻辑
Pointcut:切点 – 是一堆连接点的集合
Target:目标 – 目标组件,就是需要使用切面方法的依赖对象
Proxy:代理 – 被增强后的目标,即加入切面方法的目标类
Advice:通知 – 通知是一种时机,该时机其实就是一个时间点,即在哪个时候调用切面方法;包含:目标方法执行前、目标方法执行后、目标方法执行的前后、目标方法执行过程中,一定执行的、目标方法出现异常后
需要记住的是切面、切点、通知
关于AOP的实现方式,有JDK和cglib(导入cglib.jar)两种方式,这里了解不够多,以后会多了解
- 设置xml配置文件
<!-- 目标类 -->
<bean id="publish" class="com.demo.Publish"></bean>
<!-- 通知类 -->
<bean id="amaAdvice" class="com.demo.AmaAdvice"></bean>
<!-- 切点+通知方法的结合 -->
<!-- 切面配置 -->
<aop:config>
<aop:aspect ref="amaAdvice">
<!--pointcut:目标类的某个方法 ,切点表达式:execution(切点表达式语法) -->
<aop:before method="redPackage10"
pointcut="execution(public String com.demo.Publish.sellCY())"/>
</aop:aspect>
</aop:config>
其中
aop:before 这样的还有四个
<aop:before>:前置通知,在目标方法调用前
<aop:after>:最终通知,目标方法调用后,一定调用
<aop:after-returning>:后置通知,在目标方法调用后;如果目标方法出现异常,则不调用切面方法
<aop:after-throwing>:异常通知,在目标方法必须出现异常以后,调用
<aop:around>:环绕通知,在目标方法调用前后,都会调用
- 注解的方式
在xml中开启aop注解
aop:aspectj-autoproxy</aop:aspectj-autoproxy>
@Aspect 放在类上 认为这是一个aop有关的类
切点 @Pointcut(value=“execution(* com.**..(…))”) 放置在一个空方法上即可,类似这种,指定到方法即可
关于切点表达式总共有三种,比较常用的是execution
①bean(符合条件的对象id)
②within(符合条件的类型表达式)
within(“com.imp.StudentsDAOImp”)
③execution(方法限定表达式)
execution(int add())
@Pointcut(value="execution(* com.**.*.*(..))")
public void abc() {}
通知@Around、@After等放在切面上面
具体详细的配置实际需要使用的再进行考虑
实际开发中,通过AOP将显示在控制台上的内容,全部记录在日志文件(对某个服务器,访问一次,就会在日志文件中,记录一条)中;为了防止日志文件过大,提高存储性能,可以通过流程控制语句规定小于xx毫秒的方法不做记录,从而提高工作效率(在日志文件中只检测想要检测的数据,降低工作量。事物管理(开启事务、提交事务、回滚事务)就是AOP的经典应用,即事务管理器:底层代码通过AOP实现
- 关于AOP的事务
- 首先需要了解四大特性
- 原子性: 不可分割的一部分,要成功都成功,要失败都失败
- 隔离性: A的操作,不会影响B的操作.
- 一致性: A操作后的结果,跟B操作后的结果一样
- 持久性:事务一定会把数据的改变保存下来(insert,update,delete)
- 五大属性
1)具有只读 readOnly select
2) 具有回滚: rollback
3) 超时特性: 可以设置超时时间.
4) 隔离属性: 处理异常情况:脏读,不可重复读,幻读问题.
5) 传播属性: 两个操作相遇时的,处理方案.
- 关于spring的事务(tx)
可以进行设置事务级别
Default :依据数据库的默认值,数据库是什么级别,它就是什么级别.
ISOLATION_READ_UNCOMMITED 读未提交 读未提交,效率最高,安全最低.
ISOLATION_READ_COMMIT 读已提交数据
ISOLATION_REPEATABLE_READ 重复读,可以解决重复读,但是还有幻读
ISOLATION_SERIALIZABLE 三种问题都解决,效率低下,安全性最高,
- 这里了解不足,日后需要补充
关于spring和jdbc
配置文件,这里使用的 JdbcTemplate,使用其它类型数据库,将org.springframework.jdbc.core.JdbcTemplate切换为使用的数据库类框架即可
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${mysql.driver}"></property>
<property name="jdbcUrl" value="${mysql.url}"></property>
<property name="user" value="${mysql.username}"></property>
<property name="password" value="${mysql.password}"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
扫描dao接口
<context:component-scan base-package="com.demo.*.dao"></context:component-scan>