ここでは、Springを使用してAOPを試しています。ここでは、AOPは、データソースから接続を取得し、接続を閉じるためにも使用されます。コードは次のとおりです。
これは次のようなStudentのpojoです。
package com.database.pojo;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("student01Inj")
@Scope("prototype")
public class StudentPOJO {
private Integer studentId;
private String studentName;
public StudentPOJO(){
System.out.println(this.getClass().getName()+" initialised ....");
}
public StudentPOJO(Integer studentId,String studentName){
this.studentId = studentId;
this.studentName = studentName;
}
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
これは、ポイントカットメソッドを配置したいインターフェイスとその実装です。
次のようにStudentPOJOService.javaをインターフェースします。
package com.database.pojo;
import java.sql.Connection;
import java.util.List;
public interface StudentPOJOService {
List<StudentPOJO> getStudents(Connection[] connection);
}
上記のインターフェースの実装は次のとおりです。
package com.database.pojo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("student_pojo_ser_inj")
@Scope("singleton")
public class StudentPOJOServiceImpl implements StudentPOJOService{
@Override
public List<StudentPOJO> getStudents(Connection[] objects){
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<StudentPOJO> studentList = null;
try{
studentList = new ArrayList<StudentPOJO>();
con = (objects != null && objects.length > 0) ? objects[0] : null;
if(con == null){
System.out.println(" CON NULL ");
}
pstmt = con.prepareStatement(" select id,studentName from tblstudent ");
rs = pstmt.getResultSet();
while(rs.next()){
StudentPOJO pojo = new StudentPOJO();
pojo.setStudentId(rs.getInt("id"));
pojo.setStudentName(rs.getString("studentName"));
studentList.add(pojo);
}
}catch(Exception e){
System.out.println(" XXXXX "+e);
}
return studentList;
}
}
これは、メソッドを呼び出したいAOP関連のクラスです。
package com.database.aop;
import java.sql.Connection;
import java.sql.SQLException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;
@Aspect
@Component("databaseWrapperINJ")
@Scope("prototype")
public class DatabaseWrapperEx01 {
public DatabaseWrapperEx01 (){
System.out.println(this.getClass().getName()+" intialised ..... ");
}
@Autowired
@Qualifier("demoDatasourceInj")
public DriverManagerDataSource dataSourceManager;
private Connection con = null;
private void setConnection() throws SQLException{
this.con = this.dataSourceManager.getConnection();
}
private void closeConn() throws Exception{
if(this.con != null && !this.con.isClosed()){
this.con.close();
}
}
@Pointcut("execution(* com.database.pojo.StudentPOJOService.getStudents(..))")
public void fetchStudent() throws Throwable{ }
@Around("fetchStudent()")
public void methodCallForStudentFetch(ProceedingJoinPoint jointPoint) throws Throwable{
try{
this.setConnection();
jointPoint.proceed(new Connection[] { this.con });
this.closeConn();
}catch(Throwable e){
System.out.println(e);
this.closeConn();
}
}
}
これは、すべてのSpring定義が含まれるspring-data.xmlです。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="com.database" />
<bean id="demoDatasourceInj"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="org.apache.derby.jdbc.ClientDriver"
p:url="jdbc:derby://localhost:1527/sun-appserv-samples"
p:username="APP"
p:password="APP" />
<bean id="proxyCreator_inj" class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
</beans>
コマンドプロンプトから呼び出すメインメソッドを含むクラス、
package com.database.main;
import java.sql.Connection;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.database.pojo.StudentPOJO;
import com.database.pojo.StudentPOJOService;
public class Ex02 {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext ctx = null;
StudentPOJOService service = null;
List<StudentPOJO> studentList = null;
Connection[] cons = null;
try{
ctx = new ClassPathXmlApplicationContext("spring-data.xml");
service = (StudentPOJOService) ctx.getBean("student_pojo_ser_inj");
studentList = service.getStudents(cons);
System.out.println(" _ "+studentList.size());
}catch(Exception e){
System.out.println(e);
e.printStackTrace();
}
}
}
上記のクラスを実行しようとすると、例外が発生します。
[java] "methodCallForStudentFetch" called
[java] org.springframework.aop.AopInvocationException: AOP configuration seems to be invalid: tried calling method
[public abstract java.util.List com.database.pojo.StudentPOJOService.getStudents(java.sql.Connection[])]
on target [com.database.pojo.StudentPOJOServiceImpl@b96751];
nested exception is java.lang.IllegalArgumentException: argument type mismatch
ここで私がやろうとしているのは、AOPのデータソースから接続を取得し、「joinpoint」のメソッド「proceed」を使用して同じ接続をgetStudentsメソッドに渡すことですが、これにより、上記のような例外が発生します。
どこが間違っているのか教えてもらえますか?
返事を待って、