본문 바로가기
Kosta DevOps 과정 280기/Java

어노테이션 기반의 DI

by 롯슈83 2024. 8. 1.
  • @(at) => 자바 소스 코드 내에서 xml 대신 환경설정을 해주는 역할
<bean  /> ==> @Bean

  • @Configuration: xml 을 대신하는 환경설정 객체임을 나타냄(데이터 타입이 아님.)
  • @Bean : bean 태그를 대신하는 것을 나타냄
package exam09;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {
	
	@Bean
	public Person kim() {
		Person p = new Person();
		p.setName("김유신");
		p.setAge(20);
		return p;
	}
}

 

 

  • 클래스에 어노테이션 기반의 환경설정 파일이므로 환경설정 파일을 읽어들이는 방법이 약간 다르다. 아래는 전체 예제 코드이다.
package exam09;

public class Person {
	private String name;
	private int age;
	
	
	public Person() {
		System.out.println("생성자 동작함");
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
package exam09;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {
	
	@Bean
	public Person kim() {
		Person p = new Person();
		p.setName("김유신");
		p.setAge(20);
		return p;
	}
}
package exam09;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		//매개변수로 클래스이름.class 를 준다.
        //new ACAC를 하고 Ctrl+space 하면 자동완성이 된다.
		ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

		//나머지는 사용방법이 똑같다
		Person kim = (Person)context.getBean("kim");
		System.out.println(kim);
	}
}

 

 

포함관계에 있는 객체 생성

package exam10;

public class GoodsVO {
	private int no;
	private String item;
	private int qty;
	private int price;
	public GoodsVO(int no, String item, int qty, int price) {
		super();
		this.no = no;
		this.item = item;
		this.qty = qty;
		this.price = price;
	}
	
	@Override
	public String toString() {
		return "GoodsVO [no=" + no + ", item=" + item + ", qty=" + qty + ", price=" + price + "]";
	}
}
package exam10;

public class GoodsDAO {
	private GoodsVO goodsVO;

	public void setGoodsVO(GoodsVO goodsVO) {
		this.goodsVO = goodsVO;
	}
	
	public void insert() {
		System.out.println("상품을 등록하였습니다.");
		System.out.println(goodsVO);
	}
}
package exam10;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {
	
	@Bean
	public GoodsVO goodsVO() {
		GoodsVO g = new GoodsVO(10, "축구공", 20, 5000);
		return g;
	}
	
	@Bean
	public GoodsDAO dao() {
		GoodsDAO dao = new GoodsDAO();
		dao.setGoodsVO(goodsVO()); 
		return dao;
	}
}
package exam10;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
		GoodsDAO dao = (GoodsDAO)context.getBean("dao");
		dao.insert();
	}
}

 

 

xml 기반으로 자동으로 객체를 생성

  • 패키지만 주면 알아서 객체 생성시키기
  • xml 을 만들고 namespace 에서 context 체크 한 뒤 다시 source 로 돌아온 뒤 base-package 에 패키지 이름을 준다.
  • 그 이후, 패키지 하위의 class 에 마크를 해줘야 하는데, 보통적으로는 @Component 라고 해준다.
<?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.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<context:component-scan base-package="exam11" />
</beans>
  • dao 는 따로 역할이 있으므로,@Component 를 써도 되지만 @Repository라고 마크해준다.
package exam11;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

@Repository
public class MySqlArticleDao {
	public void insert() {
		System.out.println("추가하였습니다.");
	}
}
  • vo 는 특정 역할에 속하지 않으므로 @Component 라고 해준다.
  • 그 이후 의존관계를 자동으로 설정시킨다. 이 때, @Autowired 를 사용하며 기본 값은 byType이다.
  • 단, main 에서는 이름을 알아야 하므로 다음과 같이 설정한다.(이름을 설정하지 않을 시 객체의 이름은 모두 소문자로 자동 지정된다.)
package exam11;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("ws")
public class WriteArticleServiceImple {
	@Autowired
	private MySqlArticleDao dao; //has a 관계(포함관계)
	
	public void setDao(MySqlArticleDao dao) {
		this.dao = dao;
	}

	public void pro() {
		dao.insert();
	}
}
  • 전체 코드
package exam11;

import org.springframework.stereotype.Repository;

@Repository
public class MySqlArticleDao {
	public void insert() {
		System.out.println("추가하였습니다.");
	}
}
package exam11;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("ws")
public class WriteArticleServiceImple {
	@Autowired
	private MySqlArticleDao dao; //has a 관계(포함관계)
	
	public void setDao(MySqlArticleDao dao) {
		this.dao = dao;
	}

	public void pro() {
		dao.insert();
	}
}
<?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.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<context:component-scan base-package="exam11" />
</beans>
package exam11;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("exam11/beans.xml");
		WriteArticleServiceImple ws= (WriteArticleServiceImple)context.getBean("ws");
		ws.pro();
	}
}

 

 

어노테이션 기반으로 객체 자동 생성

  • 똑같이 base-pakege 를 줘야하므로 @ComponentScan 을 이용하여 다음과 같이 베이스패키지를 지정한다.
package exam12;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "exam12")
public class SpringConfig {
	
}
package exam12;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
		WriteArticleServiceImple ws= (WriteArticleServiceImple)context.getBean("ws");
		ws.pro();
	}
}

 

'Kosta DevOps 과정 280기 > Java' 카테고리의 다른 글

Wrapper 클래스  (0) 2024.08.08
MVC 패턴과 DI  (0) 2024.08.01
DI와 XML 이용-2  (0) 2024.08.01
어제 복습  (0) 2024.08.01
DI 의 필요성  (0) 2024.07.31