java SSM第三章学习内容(Spring核心(IOC,AOP))
需导包添加依赖
一.IOC概念(有参,无参)
案例思路:1.写实体类---接口---测试类
2.让实体类实现接口
3.让实体类实现接口
4.编辑applicationContext.xml文件,配置bean以及添加属性(constructor-arg)和值(value)
5.测试类使用上下文读取xml获得值
参考代码:
接口:
public interface IUser {
public void shuoHua();
}
实体类:
public class User implements IUser{
private String name;
private String content;
public User(String name, String content) {
super();
this.name = name;
this.content = content;
}
public void shuoHua() {
System.out.println(name+"说:"+content);
}
public User() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
applicationContext.xml:
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<!-- 以下代码,bean代表新建一个对象,id为名字,class为类型 -->
<!--constructor-arg用于设置属性,index代表下标第几个值,name代表实体类的属性名,value代表相应值 -->
<bean id="zg" class="com.entity.User">
<constructor-arg index="0" name="name">
<value>张嘎</value>
</constructor-arg>
<constructor-arg index="1" name="content">
<value>被人弄死我了</value>
</constructor-arg>
</bean>
<bean id="rd" class="com.entity.User">
<constructor-arg index="0" name="name">
<value>Rod</value>
</constructor-arg>
<constructor-arg index="1" name="content">
<value>被人弄死我了</value>
</constructor-arg>
</bean>
</beans>
测试类:
public class Test {
public static void main(String[] args) {
ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml");
IUser zhangGa = (IUser)context.getBean("zg");
IUser rod = (IUser)context.getBean("rd");
zhangGa.shuoHua();
rod.shuoHua();
}
}
二.AOP 增强切面编程
案例思路:在方法执行期间进行切面编程(插入相应的方法)
aop包里面的类:
public class Hou {
public void after(JoinPoint jp,Object result){
System.out.println("注册后要充值");
}
}
public class Huanrao {
public Object afterhr(ProceedingJoinPoint jp)throws Throwable{
System.out.println("环绕增强前");
Object o = jp.proceed();
System.out.println("环绕增强后");
return o;
}
}
public class Qian {
public void before(JoinPoint jp){
System.out.println("注册前免费送装备");
}
}
public class Yichang {
public void afterThrowing(JoinPoint jp,Exception e){
System.out.println("异常维护送你充值礼包");
}
}
public class Zuizhong {
public void afterzz(JoinPoint jp){
System.out.println("最终添加完毕");
}
}
dao接口:
public interface UserDao {
public void save(User user);
}
dao.impl:
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save(User user) {
System.out.println("保存到数据");
throw new RuntimeException("出错了");
}
}
实体类:
public class User implements java.io.Serializable {
private Integer id;
private String username;
private String password;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
serivce接口:
public interface UserService {
public void addNewUser(User user);
}
service.impl:
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("userDao")
private UserDao dao;
/*public void setDao(UserDao dao) {
this.dao = dao;
}*/
public void addNewUser(User user) {
dao.save(user);
}
}
applicationContext.xml:
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"
>
<bean id="zz" class="aop.Zuizhong"></bean>
<bean id="hr" class="aop.Huanrao"></bean>
<bean id="qz" class="aop.Qian"></bean>
<bean id="hz" class="aop.Hou"></bean>
<bean id="yc" class="aop.Yichang"></bean>
<!-- aop结构 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(public void save(..))" id="qmpoinyout"/>
<!-- 环绕增强 -->
<aop:aspect ref="hr">
<aop:around method="afterhr" pointcut-ref="qmpoinyout"/>
</aop:aspect>
<!-- 最终增强 -->
<aop:aspect ref="zz">
<aop:after method="afterzz" pointcut-ref="qmpoinyout"/>
</aop:aspect>
<!-- 前增强 -->
<aop:aspect ref="qz">
<aop:before method="before" pointcut-ref="qmpoinyout"/>
</aop:aspect>
<!-- 后增强 -->
<aop:aspect ref="hz">
<aop:after-returning method="after" pointcut-ref="qmpoinyout" returning="result"/>
</aop:aspect>
<!-- 异常 -->
<aop:aspect ref="yc">
<aop:after-throwing method="afterThrowing" pointcut-ref="qmpoinyout" throwing="e"/>
</aop:aspect>
</aop:config>
<!-- 扫描包中注解标注的类 -->
<context:component-scan base-package="service,dao.impl" />
</beans>
测试类:
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = (UserService) ctx.getBean("userService");
User user = new User();
user.setId(1);
user.setUsername("test");
user.setPassword("123456");
user.setEmail("[email protected]");
service.addNewUser(user);
}
}
注:异常注释掉了,如果异常存在不会出现环绕增强后