참고 : lazymankook.tistory.com/27
어노테이션이란 ? : velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
프로그램이 거대해 짐에 따라 XML을 이용하여 IOC Container를 설정하는 것이 점점 어려워졌고 때문에 Annotation(@)이란 것이 등장했다(이하 어노테이션). 어노테이션은 코드에 메타데이터를 작성하여 직관적인 코딩이 가능하게 만들어주며 이에 따라 생산성이 증대되는 장점을 가지고 있다.
@Configuration
- @Configuration : Configuration 어노테이션은 스프링 IOC Container에게 해당 클래스를 Bean 구성 Class임을 알려주는 것이다.
@Bean
- @Bean : 어노테이션의 경우 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용된다.
[ @Bean, @Configuration ]
개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean으로 등록할 때 @Bean 어노테이션을 활용1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuration을 명시해 주어야 함
Bean으로 만드는 annotation
어떤 클래스를 bean으로 만들기 위해선 @Bean을 사용하거나 @Component를 사용하면 된다. 그렇지만 Bean과 Component는 차이가 있다.
사용하는 관점에서 차이점은 아래와 같다.
- @Component는 클래스 상단에 적으며 그 default로 클래스 이름이 bean의 이름이 된다. 또한 spring에서 자동으로 찾고(@ComponentScan 사용) 관리해주는 bean이다.
- @Bean은 @Configuration으로 선언된 클래스 내에 있는 메소드를 정의할 때 사용한다. 이 메소드가 반환하는 객체가 bean이 되며 default로 메소드 이름이 bean의 이름이 된다.
어노테이션과 XML을 혼합해서 사용하는 방법
- Spring project name : FiveMVC
- 프로젝트는 스프링 레거시 프로젝트로 생성
- 디렉터리 구조
ApplicationConfig.java
package com.javalec.ex;
import java.util.ArrayList;
import org.springframework.context.annotation.*;
//1개 이상 Bean을 등록하고 있음을 명시하는 어노테이션
@Configuration
public class ApplicationConfig {
@Bean
public Student student1() {
// 취미 리스트에 데이터 넣기
ArrayList<String> hobbys = new ArrayList<>();
hobbys.add("수영");
hobbys.add("요리");
// 생성자에 데이터 삽입
Student student = new Student("홍길동",20,hobbys);
// 세터에 데이터 삽입
student.setWeight(80);
student.setHeight(180);
return student;
}
// @Bean
// public Student student2() {
// // 취미 리스트에 데이터 넣기
// ArrayList<String> hobbys = new ArrayList<>();
// hobbys.add("독서");
// hobbys.add("음악감상");
//
// // 생성자에 데이터 삽입
// Student student = new Student("팟캐스",30,hobbys);
// // 세터에 데이터 삽입
// student.setWeight(70);
// student.setHeight(170);
//
// return student;
// }
}
MainClass.java
package com.javalec.ex;
//import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
// AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class); // scr/main/java 에서 생성된 어노테이션을 사용할시
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
Student student1 = ctx.getBean("student1",Student.class);
System.out.println("이름 : " + student1.getName());
System.out.println("나이 : " + student1.getAge());
System.out.println("취미 : " + student1.getHobbys());
System.out.println("신장 : " + student1.getHeight());
System.out.println("몸무게 : " + student1.getWeight());
Student student2 = ctx.getBean("student2",Student.class);
System.out.println("이름 : " + student2.getName());
System.out.println("나이 : " + student2.getAge());
System.out.println("취미 : " + student2.getHobbys());
System.out.println("신장 : " + student2.getHeight());
System.out.println("몸무게 : " + student2.getWeight());
ctx.close();
}
}
Student.java
package com.javalec.ex;
import java.util.ArrayList;
public class Student {
private String name;
private int age;
private ArrayList<String> hobbys;
private double height;
private double weight;
public Student(String name, int age, ArrayList<String> hobbys) {
this.name = name;
this.age = age;
this.hobbys = hobbys;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public ArrayList<String> getHobbys() {
return hobbys;
}
public void setHobbys(ArrayList<String> hobbys) {
this.hobbys = hobbys;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
applicationCTX.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- 어노테이션에서 쓴거를 xml로 불러올때 -->
<context:annotation-config/>
<bean class = "com.javalec.ex.ApplicationConfig"/>
<bean id = "student2" class="com.javalec.ex.Student">
<constructor-arg>
<value>팟캐스</value>
</constructor-arg>
<constructor-arg>
<value>30</value>
</constructor-arg>
<constructor-arg>
<list>
<value>독서</value>
<value>음악감상</value>
</list>
</constructor-arg>
<property name="weight" value ="70"/>
<property name="height" value ="170"/>
</bean>
</beans>
어노테이션을 xml에서 호출할때 오류해결법
namespace > context 체크
DI 의존성 주입 (CGLIB 오류시)
- mvnrepository.com/ 접속
- CGLib 검색
- 맞는 버전 선택
- 해당 프로젝트 porm.xml 에 코드 삽입
!!! <dependencies> 요 안에 넣어줘야 함. </dependencies>
어노테이션으로 호출하기 (위에와 반대방법)
ApplicationConfig.java
- @ImportResource("classpath:applicationCTX.xml") 추가
applicationCTX.xml
- context 지우기 > namespace 에서 context 체크 풀기
그리고 실행..
반응형
'자바과정 > 스프링' 카테고리의 다른 글
스프링 라이프사이클 실습(생명주기, Bean 객체 생성 - 소멸) (0) | 2021.04.06 |
---|---|
라이프 사이클이란? (0) | 2021.04.06 |
스프링 실습 예제코드 (0) | 2021.04.05 |
스프링 namespace : c와 p 사용 (0) | 2021.04.05 |
스프링 과 메이븐 디렉터리 구조 (0) | 2021.04.05 |
댓글