스테레오타입 어노테이션
클래스에 붙여서 해당 클래스가 컴포넌트 스캐닝의 대상이고, 스프링에 의해서 관리될 것임을 표시한다. 즉, <beans> XML 설정 파일에서 <bean>으로 선언한 것과 같은 효과를 낸다.
@Component
메타 어노테이션. 다른 모든 스프링 스테레오타입 어노테이션 및 커스텀 Qualifer 어노테이션의 부모 어노테이션.
@Service
상태없는 서비스 컴포넌트.
@Repository
저장소 컴포넌트(DAO 등).
@Aspect
@AspectJ의 어스펙트.
@Controller
Spring MVC 컨트롤러.
스테레오타입은 스테레오타입일 뿐!! 너무 심각한 의미를 부여하지 말자! 대부분의 경우엔 @Service으로 충분하다. @Controller에 대해서는 다음 기회에 좀 더 자세히 알아보기로 하고...
위의 어노테이션이 붙은 클래스를 찾기 위해서 모든 클래스 패스를 뒤지는 것은 곤란하므로.. 아래와 같은 방식으로 스캔할 범위를 지정한다:
예) 가장 단순한 사용 예: 특정 패키지 이하의 모든 클래스에 대해서 스테레오타입 어노테이션이 붙은 클래스를 찾아서 스프링 관리 대상에 포함 시킴.(빈 선언)
<beans>
<context:component-scan base-package="com.mycompany.myblog" />
...
</beans>
<context:component-scan base-package="com.mycompany.myblog" />
...
</beans>
의존성 주입(DI; Dependency Injection) 어노테이션
@Autowired
생성자, 메소드, 필드에 붙여서 스프링을 통해 인젝션될 것임을 표시한다.
@Qualifier
@Autowired이 붙은 필드 또는 메소드의 인자에 붙여서 인젝션할 빈을 검색하기 위한 더 정확한 조건을 지정한다.
예) 필드에 지정
@Autowired
@Qualifier("myDataSource“)
private DataSource orderDataSource
@Qualifier("myDataSource“)
private DataSource orderDataSource
예) 메소드에 지정
@Autowired
public void createTemplates(DataSource ds, ConnectionFactory cf) {
this.jdbcTemplate = new JdbcTemplate(ds);
this.jmsTemplate = new JmsTemplate(cf);
}
public void createTemplates(DataSource ds, ConnectionFactory cf) {
this.jdbcTemplate = new JdbcTemplate(ds);
this.jmsTemplate = new JmsTemplate(cf);
}
예) @Qualifer와 함께 지정
public class JdbcOrderRepositoryImpl implements OrderRepository {
@Autowired
public void init(
@Qualifier("myDataSource“) DataSource orderDataSource,
@Qualifier("otherDataSource") DataSource inventoryDataSource,
MyHelper autowiredByType) {
// ...
}
...
}
@Autowired
public void init(
@Qualifier("myDataSource“) DataSource orderDataSource,
@Qualifier("otherDataSource") DataSource inventoryDataSource,
MyHelper autowiredByType) {
// ...
}
...
}
JSR-250 어노테이션
JSR-250은 BEA WebLogic에서 제공되던 것을 JSR을 통해 표준화한 것인데, @Resource어노테이션은 JNDI 리소스 인젝션을 위해 꽤 많이 쓰이고 있는 것 같다.
@Resource
JSR-250에서는 JNDI 리소스만 인젝션할 수 있었지만, 스프링 2.5에서는 스프링을 통해 관리되는 모든 빈을 인젝션할 수 있다.
@PostConstruct
2.0에서는 InitializingBean 인터페이스를 구현하고 afterPropertiesSet()에서 수행하거나, bean설정에서 init-method 속성으로 지정했다.
@PreDestory
2.0에서는 DisposableBean 인터페이스를 구현하고 destroy()를 정의하거나, bean설정에서 destroy-method 속성으로 지정했다.
개인적으로 스프링 전용인 @Autowired보다는 @Resource를 선호하는 편인데, @Qualifer를 쓸 수 없다는 단점이 있지만, @Resource(name="dataSource")처럼 빈 이름을 지정할 수 있으므로 대부분의 경우엔 충분하다.
백문불여일견, 백견불여일타, 백타불여일런!
예) 스프링 2.0.x (스프링에 대한 컴파일 타임 의존성이 없음)
public class JdbcBlogdao implement BlogDao {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }
public void init() throws Exception { ... }
public void destroy() throws Exception { ... }
...
}
<beans>
<bean id="blogDao" class="mypackage.JdbcBlogDao" init-method="init" destroy-method="destroy">
<property name="dataSource" ref="dataSource />
...
</bean>
...
</beans>
private DataSource dataSource;
public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }
public void init() throws Exception { ... }
public void destroy() throws Exception { ... }
...
}
<beans>
<bean id="blogDao" class="mypackage.JdbcBlogDao" init-method="init" destroy-method="destroy">
<property name="dataSource" ref="dataSource />
...
</bean>
...
</beans>
예) 스프링 2.0.x(스프링에 대한 컴파일 타임 의존성을 가짐)
public class JdbcBlogdao implement BlogDao, InitializingBean, DisposableBean {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }
public void afterPropertiesSet() throws Exception { ... }
public void destroy() throws Exception { ... }
...
}
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">...</bean>
<bean id="blogDao" class="mypackage.JdbcBlogDao">
<property name="dataSource" ref="dataSource />
...
</bean>
...
</beans>
private DataSource dataSource;
public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }
public void afterPropertiesSet() throws Exception { ... }
public void destroy() throws Exception { ... }
...
}
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">...</bean>
<bean id="blogDao" class="mypackage.JdbcBlogDao">
<property name="dataSource" ref="dataSource />
...
</bean>
...
</beans>
예) 스프링 2.5(어노테이션과 컴포넌트 스캔을 사용)
@Repository("blogDao")
public class JdbcBlogDao implements BlogDao {
@Resource
private DataSource dataSource;
@PreConstruct
public void init() throws Exception { ... }
@PostDestroy
public void destroy() throws Exception { ... }
...
}
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">...</bean>
<context:component-scan base-package="com.mycompany.myblog" />
...
</beans>
public class JdbcBlogDao implements BlogDao {
@Resource
private DataSource dataSource;
@PreConstruct
public void init() throws Exception { ... }
@PostDestroy
public void destroy() throws Exception { ... }
...
}
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">...</bean>
<context:component-scan base-package="com.mycompany.myblog" />
...
</beans>
다
728x90
'Carpe Programming > jsp & spring & jstl' 카테고리의 다른 글
jstl indexOf 적용 (0) | 2011.08.16 |
---|---|
[vo] 넘어오는 value 확인 (0) | 2011.08.08 |
[Spring] @Autowired 와 @Resource 차이 (0) | 2011.07.28 |
jsp txt파일 생성 (0) | 2011.07.15 |
JSP 파일경로 파일명만 자르기 (0) | 2009.11.04 |