autodi - 자바묶어버리기?
collection - set list map array 등
javaconfig - 어노테이션으로 xml 파일만들기
resource - 파일 정보
sample - mvc패턴
public class AutoDITestEntryPoint {
public static void main(String[] args) {
ConfigurableApplicationContext parent = new ClassPathXmlApplicationContext("kr/or/ddit/autoDI/conf/Parent-Context.xml");
ConfigurableApplicationContext child = new ClassPathXmlApplicationContext(new String[] {"kr/or/ddit/autoDI/conf/Child-Context.xml"}, parent);
SampleController controller = child.getBean(SampleController.class);
SampleView view = child.getBean(SampleView.class);
String code = "a001";
Map<String, Object> model = new LinkedHashMap<>();
controller.commandHandler(model, code);
view.rendering(model);
}
}
15:17:08.784 [main] INFO o.s.c.s.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@105fece7: startup date [Sat Jul 16 15:17:08 KST 2022]; root of context hierarchy
15:17:08.809 [main] INFO o.s.b.f.x.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [kr/or/ddit/autoDI/conf/Parent-Context.xml]
15:17:08.933 [main] INFO o.s.b.f.a.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
15:17:08.955 [main] INFO k.o.d.s.d.SampleDAO_Maria - class kr.or.ddit.sample.dao.SampleDAO_Maria 객체생성
15:17:08.957 [main] INFO k.o.d.s.d.SampleDAO_Oracle - class kr.or.ddit.sample.dao.SampleDAO_Oracle 객체생성
15:17:08.959 [main] INFO k.o.d.s.s.SampleServiceImpl - class kr.or.ddit.sample.service.SampleServiceImpl 객체생성_기본생성자
15:17:08.963 [main] INFO k.o.d.s.s.SampleServiceImpl - setter 주입을 통해 class kr.or.ddit.sample.dao.SampleDAO_Maria 를 주입함.
15:17:08.966 [main] INFO k.o.d.s.s.SampleServiceImpl - class kr.or.ddit.sample.service.SampleServiceImpl 객체 초기화
15:17:08.966 [main] INFO k.o.d.s.s.SampleServiceImpl - 컨테이너 hashcode : 274722023
15:17:08.982 [main] INFO o.s.c.s.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7205765b: startup date [Sat Jul 16 15:17:08 KST 2022]; parent: org.springframework.context.support.ClassPathXmlApplicationContext@105fece7
15:17:08.982 [main] INFO o.s.b.f.x.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [kr/or/ddit/autoDI/conf/Child-Context.xml]
15:17:09.007 [main] INFO o.s.b.f.a.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
15:17:09.015 [main] INFO k.o.d.s.c.SampleController - class kr.or.ddit.sample.controller.SampleController 객체 초기화
15:17:09.015 [main] INFO k.o.d.s.c.SampleController - 컨테이너 hashcode : 1912960603
15:17:09.020 [main] INFO k.o.d.s.v.SampleView - 모델 : 김은대-MARIADB
특정 영역(package) 아래 클래스를 bean으로 등록하기 위한 조건.
annotation 기반 등록
@Component @Repository @Service @Controller @RestController @ControllerAdvice @Configuration
<!-- 의존성 주입 -->
<!-- @AutoWired : type 기반의 검색 및 주입, 유일한 빈이 없는 경우, 예외 발생 -->
<!-- @Resource : 다양한 검색 조건으로 주입 조건 설정. -->
<!-- @Inject : @AutoWired 와 동일한 구조로 주입. -->
<!-- @Inject+@Named : @Resource(name)과 동일한 구조로 주입. -->
[Spring] 의존성 주입 애노테이션 정리 - @Autowired, @Resource, @Inject
[Spring] 의존성 주입 애노테이션 정리 - @Autowired, @Resource, @Inject 1. @Autowired @Autowired는 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다. @Autowired는 필드, 생성자, Setter에..
atoz-develop.tistory.com
https://codevang.tistory.com/256
@Resource, @Inject, @Autowired 사용 (자동 의존성 주입)
- Develop OS : Windows10 Ent, 64bit - WEB/WAS Server : Tomcat v9.0 - DBMS : MySQL 5.7.29 for Linux (Docker) - Language : JAVA 1.8 (JDK 1.8) - Framwork : Spring 3.1.1 Release - Build Tool : Maven 3.6..
codevang.tistory.com
<!-- 생명주기 callback -->
<!-- @PostConstruct : init-method, ** 생성된 객체의 모든 주입 동작이 종료된 이후, 초기화 callback 이 실행됨. -->
<!-- @PreDestroy : destroy-method -->
https://ttl-blog.tistory.com/99
[Spring] 빈 생명주기 콜백 - @PostConstruct, @PreDestroy
스프링 빈 생명주기 콜백 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는
ttl-blog.tistory.com
https://superbono-2020.tistory.com/186
@PostConstruct 의 사용 이유
@PostConstruct란? 종속성 주입이 완료된 후 실행되어야 하는 메서드에 사용된다. 이 어노테이션은 다른 리소스에서 호출되지 않아도 수행된다. @PostConstruct의 사용 이유 1) 생성자가 호출되었을 때,
superbono-2020.tistory.com
ClassPathXmlApplicationContext
-클래스패스안에있는 xml 어플리케이션컨텍스트 객체를 생성
ConfigurableApplicationContext
커맨드 객체(Command Object)
커맨드 객체(Command Object) 란 HttpServletRequest 를 통해 들어온 요청 파라미터들을 setter 메서드를 이용하여 객체에 정의되어있는 속성에 바인딩이 되는 객체를 의미합니다.
커맨드 객체는 보통 DTO 를 의미하며, HttpServletRequest 로 받아오는 요청 파라미터의 key 값과 동일한 이름의 속성들과 setter 메서드를 가지고 있어야 합니다.
어떻게 자동으로 바인딩을 시켜주냐 하면, 스프링이 내부적으로 HttpServletRequest 와 커맨드 객체의 setter 메서드를 이용하여 알아서 바인딩 시켜줍니다. 마치 객체를 JSON 형식으로 변환하기 위해 Jackon2ObjectMapperBuilder 가 autoDetectGettersSetters() 메서드를 이용하는 것과 비슷하다고 생각하시면 됩니다.
@Controller
@Slf4j
public class SampleController { // 컨트롤러의 의존관계? BLL과 의존관계
//인터페이스가 있어야 구현체에 의존하지않음!
@Inject
private ApplicationContext context;
@PostConstruct // 모든 의존성 주입이 끝난 이후에 동작
public void init() {
log.info("{} 객체 초기화 ", this.getClass());
log.info("컨테이너 hashcode : {} ", context.hashCode());
}
private SampleService service;
@Inject
public void setService(SampleService service) {
this.service = service;
}
public void commandHandler(Map<String, Object> model, String code) {
StringBuffer info = service.retriveSampleData(code);
model.put("info", info);
}
}
@Inject - 주입
@postConstruct // 모든 의존성 주입이 끝난 이후에 동작
@Service
@Slf4j
public class SampleServiceImpl implements SampleService {
@Inject // 스프링은 리플렉션에 활발함
private ApplicationContext context; //최상위Context
//1. new Instance 직접 생성하고 의존관계 형성 : -결합력 최상
// private SampleDAO sampleDAO = new SampleDAO_Oracle();
// private SampleDAO sampleDAO = new SampleDAO_Maria();//데이터베이스가 바껴도 로직이 바뀌는건 아님 !!, dao에 의존하니 ->service까지바꿔야함 // 결합력
//2. Factory Object Pattern - 서비스가 다오의 구현체에 직접의존하면 안됨 , but 결합력잔존
// private SampleDAO sampleDAO = new SampleDAOFactory().getSampleDAO(); //결합력이 낮아짐 , new라는 키워드없으면 아예 결합력 사라짐
//3. Strategy Pattern : 전략 주입자가 모든 결합력을 갖게됨.
private SampleDAO sampleDAO; // 완전히 결합력이 사라짐 private 외부에서 데이터 넣어줘야함, depency injection 구조
public SampleServiceImpl() {
super();//기본생성자
log.info("{} 객체생성_기본생성자", this.getClass());
}
@PostConstruct // 모든 의존성 주입이 끝난 이후에 동작
public void init() {
log.info("{} 객체 초기화 ", this.getClass());
log.info("컨테이너 hashcode : {} ", context.hashCode());
}
// @Autowired
// @Inject
// @Named("sampleDAO_Maria")
public SampleServiceImpl(SampleDAO sampleDAO) {//생성자를 통해서 dao 넣을수잇고
super();
this.sampleDAO = sampleDAO;
log.info("{} 객체생성_dao 주입생성자", this.getClass());
}
@Required
@Resource(name="sampleDAO_Maria")
public void setSampleDAO(SampleDAO sampleDAO) {// setter를 통해서도 넣을수있음
this.sampleDAO = sampleDAO;
log.info("setter 주입을 통해 {} 를 주입함.", sampleDAO.getClass());
}
@Override
public StringBuffer retriveSampleData(String code) {
String rawData = sampleDAO.selectSampleData(code);
StringBuffer info = new StringBuffer(rawData);
return info;
}
}
package kr.or.ddit.sample.dao;
import java.util.LinkedHashMap;
import java.util.Map;
import org.springframework.stereotype.Repository;
import lombok.extern.slf4j.Slf4j;
@Repository
@Slf4j
public class SampleDAO_Maria implements SampleDAO {
public SampleDAO_Maria() {
log.info("{} 객체생성", this.getClass());
}
public void init() {
log.info("{} 객체후 초기화", this.getClass());
}
public void destroy() {
log.info("{} 객체 소멸", this.getClass());
}
private Map<String, String> MARIADB = new LinkedHashMap<String, String>();
{
MARIADB.put("a001", "김은대-MARIADB");
MARIADB.put("b001", "이쁜이-MARIADB");
MARIADB.put("c001", "신용환-MARIADB");
}
@Override
public String selectSampleData(String code) {
// TODO Auto-generated method stub
return MARIADB.get(code);
}
}
스프링의 객체는 bean
스프링컨테이너 = bean컨테이너
필수의존성 -> 생성자호출
스코프생성x : default: singleton (스프링의 싱글톤 대상은 빈이다. )
init or destroy 로 콜백요청
-------------------------------------------------------------------------------------------
1.컨테이너 계층구조 , 그런구조가 왜 필요한지
2. @어노테이션을 기반으로 등록
3. 어노테이션으로 의존관계생성 후 마지막단계
bean Set 만들기
2.어노테이션
<context:annotation-config/> -- 어노테이션을 쓰겠다.
base-package --여기안에서 영역 제한 / but 모두 대상이 되는거 아님 ! 저 어노테이션 들을 사용하고 있는애들이 대상
다오는 @Repository
s표시 ㅇ등록되었다는 의미
use-default-filters="false" --기본필터링 기능 끔
어노테이션은 상속구조가없다 - 그래서 상속가 비슷한 구조를 흉내내기위해서 메타언어를 사용함
서비스는 곧 컴퍼넌트임
컴퍼넌트 하나만 집어 넣으면 사용가능하다는 얘기 (?)
컴퍼넌트가 상위개념이라는 이야기
Custom annotation
상위만 등록하기위해서 viewlayer 어노테이션 만듬
각기 다른 빈들을 등록해야한다면 기본필터링 끄고 수동으로 할수있어야함
의존관계를 자동으로 생성해서 엮어준다는 의미
cache-period="0" 캐쉬를 남기지마라 --
등록되어있는 빈이름이 리졸버가 됨