lazy-init 속성 : 해당 빈을 미리 만들어둘지 아니면 요청이 오면 만들지 정의해주는 속성
destory-method="close" : dbcp나 c3p0 을 이용하여 jdbc설정시에는 명시해줘야 한다고 함
DriverManagerDataSource 의 경우에는 스프링이 이를 대신해주므로 해당 설정을 할 필요가 없다 함
간단한 구조의 경우에는 DAO와 SERVICE를 합쳐도 무방하다.
전통적 구조
- 프리젠테이션 => SPRING MVC
- 서비스 계층 => POJO
- 트랜잭션 => AOP
- 데이터엑세스 => JDBC, JPA, 하이버네이트, JDO
오브젝트 중심과 도메인 중심이 있음.
오브젝트 중신음 위의 케이스라 보여짐
도메인 중심의 경우 domain이 단순히 get/set 기능을 가진 것이 아닌
해당 도메인에 관련 로직을 도메인이 종속시키는 방법인듯 함
이 경우 서비스계층에서는 여러 도메인에 걸치는 경우 사용하고
그외에는 도메인에 종속시킴
하이버네이트 일 경우 가능할 듯 함
기본적으로는 stateless 이나 stateful 도 가능하다고 함
mvc:annotation-drriven
SimpleDriverDataSource
DriverManagerDataSource
lazy-init : 요청 받을 시 bean 생성함
Exception 발생시
HandleExceptionResolve 인터페이스
구현 : SimpleMappingExceptionResolve
@ErrorHandler 를 통해서도 가능
설정 시 property
mappedHandler : 특정 맵 핸들시 셋팅
mappedHandlerClasses : 특정 맵 핸들시 클래스 셋팅
defaultErrorView : 기본 View 페이지 셋팅
defaultStatusCode : 예외가 떳을 때 HTTP 상태코드
exceptionAttribute : 예외가 노출시킨 기본 모델 속성, 기본 => ${exception.message}
메타정보 등록
StaticApplicationContext : 코드에 의해 메타정보를 등록하는 기능을 제공
StaticWebApplicationContext
GenericApplicationContext : 특정 포맷의 설정 메타정보를 읽어올 수 있음
XmlBeanDefinitionReader : xml파일을 읽어올 때 사용되는 리더
PropertiesBeanDefinitionReader : 프로퍼티 파일을 읽어올 때 사용되는 리더
=> JUnit 에서 annotation 을 통해 사용 시
@ContextConfiguration 설정 시 GenericApplicationContext를 사용할 수 있음
GenericXmlApplicationContext : XmlBeanDefinitionReader와 GenericApplicationContext가 결합
WebApplicationContext
스프링 통해 web.xml 인코딩 설정 방법
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
@Component
- 빈 스캐닝 대상이 됨 => bean 으로 생성됨
- 디폴트로 클래스이름의 첫글자를 소문자로 해서 등록
- ("이름") 을 통해서 별도의 빈 이름을 지정할 수 있음
어노테이션 사용 시 사용되는 context => AnnotationConfigApplicationContext
<context:component-scan base-package="~~~"/>
빈으로 생성하는 어노테이슨
@Reposigory => DAO
@Service => Service
@Controller => controller
@Component => 일반 bean
클래스 이용 설정 시 설정할 클래스를 생성 후 Annotation으로 @Configuration 을 선언한다.
설정에 사용하는 자바파일안에서 메서드에 @Bean 선언 시 bean으로 등록된다.
public hello hello() {
return new Hello();
}
이 경우 new 이지만 싱글톤으로 생성된다.
@Configuration 의 메타로 @Component 가 사용되기 때문에 @Configuration 도 bean으로 등록이 된다.
@Configuration 없이 POJO에서 메서드에 @Bean 사용 시 싱글턴이 안되는 상황
=> 내부적으로 @Bean 메서드에서 다른 메서드를 호출하여 주입을 받을 경우
이 경우 new 로 항상 새롭게 생성된다고 한다.
@Resource : 수정자에 정의하면 bean이 주입됨
- <context:annotation-confir> : 빈 후처리기 등록, 이미 생성된 BEAN을 주입 처리 해주는 듯 함
- <context:component-scan > : 빈 등록도 자동으로 처리 하는 듯 함
@Resource를 필드에 붙일 경우 수정자가 필요 없음
=> 필드 주입함
@Resource 주입 순서(?)
- name 프로퍼티로 검색
- 디폴트 이름 검색
- type으로 자동 와이어링
@Autowired 시 동일TYPE BEAN이 여러개일 경우
1. 콜렉션 사용 가능
@Autowired
Collection<Printer> printer;
2. 배열 사용
@Autowired
Printer[] printer;
3. Map 사용
@Autowired
Map<String, Printer> print;
※ 빈 자체가 컬렉션일 경우 @Autowired 이용한 여러개의 같은 타입 Bean 주입은 불가능함
@Qualifier : @Autowired의 세부 정의를 가능하게 함
사용시
@Autowired
@Qualifier("mainDB")
BEAN선언시
- xml
<bean id="oracleDataSource" class="">
<quailifier value="mainDB">
</bean>
- annotation
@Component
@Qualifier("mainDB")
Public class 솰로솰라
@Transactional 을 통해 트랜잭션 처리를 위한 설정
<tx:annotation-drivern transaction-manager="txManager">
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">
</bean>
<context:property-placeholder location="classpath:database.properties">
properties 파일을 읽음
List 주입시
<property name="names">
<list>
<value>lee</value>
<value>two</value>
</list>
</property>
SET => list 대신 set
<property name="names">
<set>
<value>lee</value>
<value>two</value>
</set>
</property>
MAP
<property name="names">
<map>
<entity>lee</entity>
<entity>two</entity>
</map>
</property>
Properties
<property name="names">
<props>
<prop>one</prop>
<prop>two</prop>
</props>
</property>
LIST, SET, MAP, Properties 를 Bean으로 등록하고자할 경우
<util:list>
<util:set>
<util:map>
<util:properties>
사용
properties 일 경우에는
<util:properties id="setting" location="classpath::database.properties">
<null /> => Null값을 의미
설정파일에서 치환자 ${} 사용 가능
1. propertie-placeholder 선언
<context:property-placeholder location="classpath:db.properties">
그 후 #{} 를 이용해 접근이 가능함
PropertyPlaceHolderConfigurer 빈이 등록된 후 xml 설정 파일을 치환하게 됨
=> 빈팩토리 후처리기
SpEL을 통해서도 가능함
1. utils:properties 이용하여 properties 빈 등록
<utils:properties location="classpath::db.properties">
Properties 는 Map 인터페이스 구현이므로 spEL 도 get 형식이어야 함
#{dbprops['db.username']}
@value 에서도 사용가능함
PropertyPlaceHolderConfigurer 의 경우 값이 있으면 치환, 없으면 치환문자를 그대로 두기 때문에 문제가 될 수 있음
그에 비해 SpEL 의 경우에는 치환값이 없으면 오류가 발생하는 듯 함
ApplicationContext 도 빈 이므로 주입 가능함
@Autowried ApplicationContext context;
annotation 없을 경우
ApplicationContextAware.setApplicationContext() 를 이용함
Bean 팩토리 역시 bean이므로 주입 가능
@Autowired BeanFactory bf;
서블리 컨텍스트 리소스 읽을 경우 => ResourceLoader 클래스 사용
@Autowired ResourceLoader resourceLoader;
System 클래스 정보값 읽을 경우
System.getProperties() => systemPropertis 로 접근 가능
#{systemProperties['OS.name']}
System.getEnv() => systemEnvironment