spring 의 IOC 와 AOP.
7045 단어 spring ioc aop
Spring 에 관 해 서 는 모두 가 잘 알 고 있 습 니 다. 개발 과정 에서 대체적으로 여기저기 서 사용 되 고 있 습 니 다. Spring 은 여러 개의 모듈 이 있 습 니 다. 초보 자 에 게 Spring 을 배 우 는 것 은 요령 을 찾 지 못 할 수도 있 습 니 다. 이렇게 많은 모듈 을 어디서 배 워 야 합 니까?사실 저 는 처음에 Spring 을 공 부 했 을 때 도 무슨 말 인지 몰 랐 습 니 다. 나중에 천천히 많이 썼 고 많이 봤 습 니 다. Spring 에 대해 자신 만 의 소감 을 알 게 되 었 습 니 다. Spring 의 가장 핵심 적 인 것 은 IOC 모듈 과 AOP 모듈 입 니 다.
IOC 모듈 은 우리 주변 에서 '반전 제어' 로 번역 되 었 다. 사실 처음에 나 는 이 단 어 를 보 았 을 때 도 매우 이상 하 다 고 느 꼈 다. 이해 하기 어 려 웠 다. 먼저 '통제' 에 대해 이야기 했다.무엇 을 제어 할 까요? 우 리 는 대상 을 대상 으로 하 는 프로그래머 들 이 일반적으로 알 고 있 습 니 다. 우리 가 개발 하 는 과정 에서 서로 다른 유형 에서 다양한 대상 을 예화 해 야 합 니 다. 즉, 하나의 유형 에서 다른 유형의 인 스 턴 스 를 참조 합 니 다. 가장 간단 한 방법 은:
ObjectA objA =new ObjectA();
필요 한 것 은 new 하나 입 니 다. 이렇게 되면 우리 의 프로젝트 를 해 보 니 내 보 내기 가 모두 new 대상 에 있 습 니 다. 그러면 코드 의 결합 도 를 초래 합 니 다. 이것 은 우리 가 대상 을 대상 으로 하 는 확장 가능 하고 유지 가능 하 며 재 활용 가능 한 사상 과 심각하게 일치 하지 않 습 니 다. 여기 서 이른바 '제어' 입 니 다."바로 우리 가 대상 이 필요 할 때 스스로 뉴 하 나 를 가서 대상 의 생사 를 스스로 통제 하 는 것 입 니 다.
"반전" 이 라 고 말 하면 우리 프로젝트 에서 Spring 을 사용 한 후에 한 프로젝트 가 끝나 면 세심 한 학생 들 은 프로젝트 에 New 가 나타 나 는 빈도 가 현저히 낮 아 졌 다 는 것 을 알 게 될 것 이다. 대신 하나의 설정 파일 이다. Spring 2.5 이전에 우 리 는 Bean 정 의 를 설정 했다. 예 를 들 어:
<bean id="cureResultDao" class="com.nbey.data.forward.mongo.business.impl.CureResultDao" />
<bean id="ecgResultDao" class="com.nbey.data.forward.mongo.business.impl.EcgResultDao" />
사용 할 때:
public static synchronized ApplicationContext getApplicationContext() {
if (applicationContext == null) {
applicationContext = new ClassPathXmlApplicationContext(
configLocations);
}
return applicationContext;
}
IEcgResultDao ecgResultDao = getApplicationContext().getBean(
"ecgResultDao", EcgResultDao.class);
보기 에는 여전히 번 거 로 운 것 같 습 니 다. 여러 개의 Bean 을 설정 해 야 합 니 다. 그러나 우 리 는 프로젝트 에서 New 로 직접 가지 않 아 도 됩 니 다. 여기 서 우리 가 필요 로 하 는 대상 은 Spring 이 직접 생산 하고 모든 정 의 된 대상 은 Spring 이 관리 합 니 다. 필요 할 때 드 리 겠 습 니 다. 여기 서 '대상 의 관리 권한 이 Spring 에 게 반전 되 었 습 니 다' 입 니 다. ,다행히 자바 의 주해 가 생 긴 후에 주 해 를 사용 하면 XML 안의 Bean 의 정 의 를 크게 줄 일 수 있다.
<context:annotation-config/>
<context:component-scan base-package="com.zhuyun.nbey.controller" />
<context:component-scan base-package="com.zhuyun.nbey.business.manager" />
<context:component-scan base-package="com.zhuyun.nbey.mysql.business" />
@Controller
public class AppController {
@Autowired
private IBrjbxxDao brjbxxDao;
@Autowired
private IJzsjDao jzsjDao;
@Autowired
private IGhxxbDao ghxxDao;
@Autowired
private IZybrxxDao zyxxDao;
주 해 를 이용 하여 Bean 의 조립 을 비교적 간단하게 실 현 했 는데 여기 서 '반전 제어' 가 끝 날 것 이다.
다음은 AOP 이다. AOP 의 디자인 사상 은 대리 모델 의 실현 이다. 이런 사상 은 많은 장면 에 사용 할 수 있다. 대 리 는 자바 의 대리 이 고 인 터 페 이 스 를 바탕 으로 하 는 것 이다. 이런 대리 업 무 는 하나의 대리 자 를 정적 대리 라 고 부른다. 또한 cglib 의 동적 대리 이 고 차단 방법의 호출 요 구 를 할 수 있다. 게다가 자신의 업무 논리, Spring 에서 이 를 실현 하 였 습 니 다. 예 를 들 어 다음 코드 세 션 입 니 다.
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mchz.brook.jdbc.facade.ConnectionAspectFacade;
import com.mchz.brook.jdbc.facade.SqlLogAspectFacade;
public class PreparedStatementLoggingProxy implements InvocationHandler {
static final Logger logger = LoggerFactory.getLogger(PreparedStatementLoggingProxy.class);
Object target = null;
String sql = null;
static List setMethods = Arrays.asList(new String[]{"setAsciiStream", "setBigDecimal", "setBinaryStream"
, "setBoolean", "setByte", "setBytes", "setCharacterStream", "setDate", "setDouble", "setFloat"
, "setInt", "setLong", "setObject", "setShort", "setString", "setTime", "setTimestamp", "setURL"});
static List executeMethods = Arrays.asList(new String[]{ "execute", "executeQuery", "executeUpdate","executeBatch"});
public PreparedStatementLoggingProxy(Object ps, String sql){
target=ps;
this.sql=sql;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object r = null;
try {
long t1 = 0;
boolean toLog = (StatementLogger.logger.isInfoEnabled()
|| SlowQueryLogger.logger.isInfoEnabled()) && executeMethods.contains(method.getName());
if(toLog)
t1 = System.currentTimeMillis();
if(executeMethods.contains(method.getName())){
ConnectionAspectFacade.createStatementAdvice(target);
}
r = method.invoke(target, args);
} catch(Throwable t) {
LogUtils.handleException(t, StatementLogger.logger, LogUtils.createLogEntry(method, sql, null, null));
}
return r;
}
protected void executeLogAdvice(Method method) {
try{
if(executeMethods.contains(method.getName())){
SqlLogAspectFacade.logAdvice(sql);
}
} catch (Exception ex) {
ex.printStackTrace();
}
Spring AOP 관련 개념
Aspect (절단면) 는 로그, 사무, 보안 등 업무 클래스 에 추가 할 비 업무 기능 을 제공 합 니 다. 즉, 실현 할 시스템 요구 사항 입 니 다. Advice (알림) 는 위의 예제 에서 로그 기능 이 매우 통용 될 수 있 습 니 다. 로그 기능 을 하나의 클래스 로 만 들 면 사용 할 때 만 호출 하면 매우 편리 합 니 다. 이 종 류 는 특정한 Aspect (절단면) 라 고 할 수 있 습 니 다.의 구체 적 인 실현, 즉 알림 입 니 다. 따라서 절단면 은 개념 적 인 의미 이 고 알림 이 구체 적 인 실현 입 니 다. Joinpoint (연결 점 Pointcut (연결 점) Joinpoint (연결 점) 는 목표 대상 에 적 용 됩 니 다. Target (목표 대상) 은 대 리 될 대상 (업무 인터페이스) Weave (짜 임) 입 니 다.알림 을 대상 에 적용 하고 마지막 으로 프 록 시 대상 을 생 성 하 는 과정 을 Advices 라 고 합 니 다. 앞에서 언급 한 바 와 같이 하나의 알림 이 고 절단면 의 구체 적 인 실현 입 니 다. 그러나 언제 알림 을 사용 하 는 지, spring 은 연결 점 으로 설명 하 였 으 나 하나의 개념 적 인 사물 일 뿐 입 니 다. 어떻게 구체 적 으로 실시 합 니까? spring 에서 알림 과 연결 점 을 하나 로 합 쳤 습 니 다.실시 합 니 다. 다음 과 같은 네 가지 유형의 알림 이 생 성 되 었 습 니 다. BeforeAdvice (사전 알림) org. springframework. aop. MethodBeforeAdvice After Advice (사후 알림) AroundAdvice (서 라운드 알림) org. aopaliance. intercept. MethodInvocation Throw Advice (이상 알림) org. springframework. aop. ThrowAdvice