230309 Spring Annotation

kangjuju·2023년 3월 9일
0

Spring

목록 보기
2/13

Spring Annotation

  • Annotation을 활용하여 XML파일을 간결히했다.

Sender.java

  • @Component을 클래스 주석으로 Bean등록을 바로함
@Component //Bean으로 등록할 때 사용하는 Annotation
@Scope("singleton")
public class Sender {
	public void show() {
		System.out.println("show 메소드 호출");
	}
} 

SenderProcess.java

  • 등록한 Bean을 처리메소드에서 사용한다.
  • @Service 와 @Component는 bean등록으로써 역할은 같으나 가독성의 차이로 사용한다.
  • setter 또는 constructor injection 은 @Autowired 주석으로 대신하여 자동처리하므로 구현하지않았다.
@Service 
public class SenderProcess {
	@Autowired //setter,constructor injection 생략 가능케함
	private Sender sender;
	
	/*
	public void setSender(Sender sender) {
		this.sender = sender;
	}
	*/
    
	//객체반환
	public Sender getSender() {
		return sender;
	}
	//내부 메소드 사용
	public void displayData() {
		sender.show(); //Bean사용
	}
} 

@Autowired 애노테이션
생성자, 필드(프로퍼티), 설정메서드(set메서드)에 지정 가능
타입을 이용해서 자동적으로 프로퍼티 값을 설정.

  • 해당 타입의 빈 객체가 존재하지 않는 경우 예외 처리
    @Autowired(required=false)로 지정: 기본값은 @Autowired(required=true)
    false로 하면 빈 객체가 존재하지 않더라도 예외처리를 발생시키지 않는다.

init.xml

<context:component-scan base-package="anno1_auto" /> 추가.
스프링이 자동으로 패키지명을 따라 scan 처리함

Main

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("init.xml");
		SenderProcess process = 
        context.getBean("senderProcess",SenderProcess.class);
		process.displayData();
	} 

@Autowired~@Qualifier("")

Interface의 같은타입 Bean객체가 2개 이상일때

SenderInter.interface

  • SenderInter의 자식클래스가 2개이고, 그 둘은 같은 타입이다.
    + @Component 이후 이름을 각자 명시해두었다.
public interface SenderInter {
	void show();
}

@Component("sender") //Bean으로 등록할 때 사용하는 Annotation
public class Sender implements SenderInter{
	public void show() {
		System.out.println("show 메소드 호출");
	}
}
@Component("sender2")
public class Sender2 implements SenderInter{
	public void show() {
		System.out.println("Sender2 show 메소드 호출");
		System.out.println("~~");
	}
} 

처리메소드 SenderProcess.java

  • type에 의한 매핑을 하는 @Autowired 는, 위 인터페이스 자식클래스들과 같이 같은 타입이 여러개일때 사용시 @Qualifier로 명시해 주지 않으면 에러가 발생한다.
@Service
public class SenderProcess {
	@Autowired
	@Qualifier("sender2") //sender2 component를 사용키로 명시
	private SenderInter senderInter;
	// 객체반환
	public SenderInter getSenderInter() {
		return senderInter;
	}
	// 내부 메소드 사용
	public void displayData() {
		senderInter.show();
	}
} 

@Autowired 로 자동 매핑하려 했을때 같은 인터페이스 타입 클래스가 여러개여서 무엇을 매핑할지를 프로그램은 모르기때문에 어찌보면 당연하다.


@Resource

  • @Resource 는 name에 의한 매핑 Annotation이다.
  • abc인터페이스의 자식 클래스 2개인 abc1,2라고 가정한다.
@Service
public class AbcProcess {
	@Resource(name="abc1")
	private Abc1 abc1;
//	@Resource(name="abc2")
	private Abc2 abc2;	
	//메소드에도 장착가능
	@Resource(name="abc2")
	public void setAbc2(Abc2 abc2) {
		this.abc2 = abc2;
	}
	
	public void showData() {
		abc1.setIrum("홍길동");
		abc2.setNai(22);
		
		String str = "결과 : 이름" + abc1.getIrum() + " 나이는 " + abc2.getNai();
		System.out.println(str);
	}
} 
  • Main에서 출력
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("init2.xml");
		AbcProcess process = context.getBean("abcProcess",AbcProcess.class);
		process.showData();
	} 

XML 배열관리

	public static void main(String[] args) {
		String[] metas = new String[] {"init.xml" , "init2.xml"};
		ApplicationContext context = new ClassPathXmlApplicationContext(metas[1]);
		AbcProcess process = context.getBean("abcProcess",AbcProcess.class);
		process.showData();
	} 

@Value + spEL

  • 처리용 클래스에 @Value 로 파라미터를 바로 적용.
  • 여러가지 파라미터 매핑방법을 확인했다.
@Service("my")
public class MyProcess {
	private String name;
	private String part;
	public MyProcess() {
	}
	@Autowired //없으면 part null값 나옴
	public MyProcess(@Value("#{dataInfo.part}") String part) { //Spring EL사용
		this.part = part;
	}
	
	@Value("#{dataInfo.job}")
	private String job;
    
	@Value("30")
	private int age;
    
	@Value("1,2,3,4")
	private int arr[];
    
	public void showResult() {
		System.out.println(part);
		System.out.println(name);
		System.out.println(job);
        System.out.println(age);
        System.out.println(arr[1] + arr[2]);
	}
} 

#{dataInfo.part} : 객체변수명.메소드. 아래의 코드를 뜻한다.

@Component
public class DataInfo {
	@Value("#{dataInfo.name}") //여기서도 가능
	private String name;
	private String part="AI부";
	public String job = "프로그래머"; //get X. public
	
	public String getName() {
		return name;
	}
	public String getPart() {
		return part;
	}
} 

0개의 댓글