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메서드)에 지정 가능
타입을 이용해서 자동적으로 프로퍼티 값을 설정.
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();
}
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
는 name에 의한 매핑 Annotation이다.@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);
}
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("init2.xml");
AbcProcess process = context.getBean("abcProcess",AbcProcess.class);
process.showData();
}
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
로 파라미터를 바로 적용.@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;
}
}