자 이번시간에는 자바코드를 활용한 빈 등록에 대해서 알아볼 것이다.
위 자바코드는 xml 사용방식이고
두번쨰 자바코드는 자바 사용방식이다.
--> 주로 xml을 이용하는 것보다는 자바파일 즉 어노테이션을 이용한다. 혼용해서 사용하는 사람들도 많다.
MainClass.java
package kr.co.softcampus.main;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;
import kr.co.softcampus.beans.TestBean3;
import kr.co.softcampus.beans.TestBean4;
import kr.co.softcampus.config.BeanConfigClass;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
//xml을 사용하는 방식
ClassPathXmlApplicationContext ctx1 = new ClassPathXmlApplicationContext("kr/co/softcampus/con
TestBean1 xml1 = ctx1.getBean("xml1" , TestBean1.class);
System.out.printf("xml1 : %s\n",xml1 );
TestBean1 xml11 = ctx1.getBean("xml1" , TestBean1.class);
System.out.printf("xml1 : %s\n",xml11 );
System.out.println("--------------------------------");
TestBean2 xml2 = ctx1.getBean("xml2",TestBean2.class);
System.out.printf("xml2: %s\n",xml2);
TestBean2 xml22 = ctx1.getBean("xml2",TestBean2.class);
System.out.printf("xml2: %s\n",xml22);
System.out.println("------------------------------");
TestBean3 xml3 = ctx1.getBean("xml3",TestBean3.class);
System.out.printf("xml3: %s\n",xml3);
TestBean3 xml33 = ctx1.getBean("xml3",TestBean3.class);
System.out.printf("xml3: %s\n",xml33);
//서로 다른 프로토타입으로 인한 다른 객체결괏값이 나온다.
System.out.println("------------------------------");
TestBean4 t4 = ctx1.getBean(TestBean4.class);
System.out.printf("t4: %s\n",t4);
ctx1.close();
System.out.println("=============================");
//java파일을 사용하는 방식
AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(BeanConfigCla
TestBean1 java1 = ctx2.getBean("java1",TestBean1.class);
System.out.printf("java1: %s\n",java1);
ctx2.close();
TestBean1 java11 = ctx2.getBean("java1",TestBean1.class);
System.out.printf("java11 : %s\n",java11);
//TestBean1 java500 = ctx2.getBean("java500",TestBean1.class);
TestBean1 java600 = ctx2.getBean("java600",TestBean1.class);
System.out.printf("java600 : %s\n",java600);
TestBean2 java2 = ctx2.getBean("java2",TestBean2.class);
System.out.printf("java2:%s\n",java2);
TestBean2 java22 = ctx2.getBean("java2",TestBean2.class);
System.out.printf("java2:%s\n",java22);
//같은 객체의 주소값을 받아온다. (singleton이기 떄문이다.)
TestBean3 java3 = ctx2.getBean("java3",TestBean3.class);
System.out.printf("java3:%s\n",java3);
TestBean3 java33 = ctx2.getBean("java3",TestBean3.class);
System.out.printf("java3:%s\n",java33);
System.out.println("--------------------------");
TestBean4 java4 = ctx2.getBean(TestBean4.class);
System.out.printf("java4 : %s\n",java4);
ctx2.close();
}
}
BeanConfigClass.java
package kr.co.softcampus.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;
import kr.co.softcampus.beans.TestBean3;
import kr.co.softcampus.beans.TestBean4;
@Configuration
public class BeanConfigClass {
@Bean
public TestBean1 java1() {
TestBean1 t1 = new TestBean1();
return t1;
}
//이렇게 메서드를 만들어놓고 아무런 작업도하지 않았다.
//여기서 이 java1메서드의 이름이 빈의 아이디가 된다.
@Bean(name="java600")
public TestBean1 java500() {
TestBean1 t1 = new TestBean1();
return t1;
//얘는 메소드의 이름이 java500이기때문에 , 이 메소드에서 반환하는 이 빈객체는 java500이라는 이름으로 등록이 된다.
// 하지만 @Bean(name="java600") 이렇게 하면 새로운 이름이 등록이 된다.
}
@Bean
@Lazy
public TestBean2 java2() {
TestBean2 t2 = new TestBean2();
return t2;
//이렇게 하면,
// <bean id ="xml2" class="kr.co.softcampus.beans.TestBean2" lazy-init="true"/>
// <!-- 자 lazy-init="true"를 넣어주면 xml을 로딩할떄 객체를 생성하는 게 아닌 getBean()메소드를생성할떄, 객체를생성한다. -->
// 이 코드와 같게 된다.
}
@Bean
@Scope("prototype")
public TestBean3 java3() {
TestBean3 t3 = new TestBean3();
return t3;
}
//getBean을 MainClass에서 getBean 할때마다 계속해서 새로운 객체를 생성한다.
@Bean
public TestBean4 java4() {
TestBean4 t4 = new TestBean4();
return t4;
}
@Bean
@Primary
public TestBean4 java5() {
TestBean4 t4 = new TestBean4();
return t4;
}
//이런식으로 똑같은 타입의 빈 클래스가 정의되어 있을경우 자바 컴파일러는 인식을 하지를 못한다.
//그래서 이런경우에 클래스타입을 가지고 빈을 가지고 오면 @Primary 어노테이션을 넣으면성공한다.
}
beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="xml1" class="kr.co.softcampus.beans.TestBean1"/>
<!-- 이 bean의 주소값을 가져오기 위해서는 id를 가지고 있어야만 한다. -->
<bean id ="xml2" class="kr.co.softcampus.beans.TestBean2" lazy-init="true"/>
<!-- 자 lazy-init="true"를 넣어주면 xml을 로딩할떄 객체를 생성하는 게 아닌 getBean()메소드를생성할떄, 객체를생성한다. -->
<bean id ="xml3" class="kr.co.softcampus.beans.TestBean3" scope="prototype"/>
<bean class="kr.co.softcampus.beans.TestBean4"/>
<!-- 만약에 아이디가 없는 빈을 사용하겠다 하면, 클래스파일만 MainClass.java파일에서 지정하면 된다. -->
<bean class="kr.co.softcampus.beans.TestBean4" primary="true"/>
<!-- 똑같은클래스의 값이 여러개가 정의되어있다면, primary="true"로 같은클래스중에서 사용할 클래스를 지정한다. -->
</beans>
TestBean1.java
package kr.co.softcampus.beans;
public class TestBean1 {
public TestBean1() {
System.out.println("TestBean1의 생성");
}
}
TestBean2.java
package kr.co.softcampus.beans;
public class TestBean2 {
public TestBean2() {
System.out.println("TestBean2의 생성자 ");
}
}
TestBean3.java
package kr.co.softcampus.beans;
public class TestBean3 {
public TestBean3() {
System.out.println("TestBean3의 생성자 ");
}
}
TestBean4.java
package kr.co.softcampus.beans;
public class TestBean4 {
public TestBean4() {
System.out.println("TestBean4의 생성자 ");
}
}
위 코드들 잘 보자.!
'웹 프로그래밍(풀스택-->java) > 웹프로그래밍(백엔드-->java)' 카테고리의 다른 글
61. 주입 (0) | 2021.12.26 |
---|---|
60. Init,destroy 메서드 (0) | 2021.12.25 |
58. 자동주입 (0) | 2021.12.24 |
57. 컬렉션 주입 (0) | 2021.12.22 |
56. Setter 메서드를 통한 주입 (0) | 2021.12.20 |