问题出现的情况是这样的,首先我在xml里面启用了事务注解
然后再另一个类中配置了切面
package test.ssh.advice;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class XMLAspect {
@Pointcut("execution(public * test.ssh.service.*.*(..))")
public void pointCutService(){}
@Before("pointCutService()")
public void before(){
System.out.println("before start");
}
@After("pointCutService()")
public void after(){
System.out.println("after start");
}
@AfterReturning("pointCutService()")
public void afterReturning(){
System.out.println(" afterReturning start");
}
@AfterThrowing("pointCutService()")
public void throwAble(){
System.out.println(" throwAble start");
}
@Around("pointCutService()")
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("around start");
pjp.proceed();
System.out.println("around end");
}
}
接着我对数据库中的一条记录进行查询,奇怪的是在方法内部是查询出来了数据,但是当我把这条数据返回出去的时候发生了奇怪的事情,我在外面吧返回出去的值打印出来居然是null。代码如下
测试代码:
public static void main(String[] args) throws SQLException {
ApplicationContext springContext = new ClassPathXmlApplicationContext("annotationBeans.xml");
User user = (User) springContext.getBean("user");
user.setName("test1");
System.out.println("check "+userServiceInter.select(user));
System.out.println(userServiceInter.query());
}
输出结果如下:
23:55:24,639 INFO SchemaUpdate:182 - HHH000228: Running hbm2ddl schema update
23:55:24,641 INFO SchemaUpdate:193 - HHH000102: Fetching database metadata
23:55:24,644 INFO SchemaUpdate:205 - HHH000396: Updating schema
23:55:24,692 INFO TableMetadata:65 - HHH000261: Table found: mytest.table_user
23:55:24,692 INFO TableMetadata:66 - HHH000037: Columns: [id, name]
23:55:24,692 INFO TableMetadata:68 - HHH000108: Foreign keys: []
23:55:24,693 INFO TableMetadata:69 - HHH000126: Indexes: [primary]
23:55:24,694 INFO SchemaUpdate:240 - HHH000232: Schema update complete
Methodstart
around start
before start
Hibernate: select user0_.id as id0_, user0_.name as name0_ from table_user user0_ where user0_.name=?
id 44 name test1
around end
after start
afterReturning start
method returning
check null
Methodstart
around start
before start
around end
after start
afterReturning start
method returning
null
service类的代码:
package test.ssh.service;
import javax.annotation.Resource;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import test.ssh.demo.User;
import test.ssh.inter.UserServiceInter;
@Component
@Transactional
public class UserService implements UserServiceInter{
private SessionFactory sessionFactory;
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public void save(User user) {
sessionFactory.getCurrentSession().save(user);
}
@Override
public void delete(User user) {
// TODO Auto-generated method stub
}
@Override
public void update(User user) {
System.out.println(user.getName()+"is saving");
}
@Override
public User select(User user) {
String hql="from User where name = ?";
user = (User) sessionFactory.getCurrentSession().createQuery(hql).setString(0, user.getName()).uniqueResult();
System.out.println("id "+user.getId()+" name "+user.getName());
User test = new User();
test.setId(user.getId());
test.setName(user.getName());
return user;
}
@Override
public User query() {
// TODO Auto-generated method stub
return new User();
}
}
非常奇怪,我试着直接返回一个new出来的对象居然也是null。
经过一番折腾,怀疑是spring的申明式事务和我申明的切面冲突了。将around注释掉就可以正常返回结果。虽然说问题得到解决了 不过还是想知道为什么会这样。我看视频上不是说切面可以在切入点随意的添加逻辑的而不影响方法本身的执行么,如果这样的话就不应该会返回null阿。