- @(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 |