728x90
Annotation : 코드파일에 설정을 심을때 사용되는 설정 정보

 

xml하단 메뉴탭 Namespaces클릭 후 context 체크

 

OK

 

다시 Source로가서 추가된 열 확인 후 <context:annotation-config>태그 추가

 <context:annotation-config> : 객체를 만들면서 그 안에 어노테이션(annotation)이 있는지 확인

 


@Autowired : 자동으로 객체 연결 

id와 관계 없이 인터페이스명(아래 예제에서 Exam)으로 참조할 수 있는 객체를 자동으로 찾아서 바인딩 

@Autowired
@Override
public void setExam(Exam exam) {
	this.exam = exam;
}
  • spring.di.ui.InlineExamConsole.java파일 setExam메소드 위에 @Autowired 추가 (import)
    @Autowired : 자동으로 객체 연결 (xml파일의 <property name="exam" ref="exam"/>과 같음)
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />
<bean id="console" class="spring.di.ui.InlineExamConsole" >
	<!-- <property name="exam" ref="exam"/> -->
</bean>
  • xml파일 <property name="exam" ref="exam"/> 삭제

@Qualifier : 다수의 사용할 수 있는 객체가 있는 경우 id를 지정하여 연결

@Autowired
@Qualifier("exam1")
@Override
public void setExam(Exam exam) {
	this.exam = exam;
}
  • @Autowired 아래에 @Qualifier 추가 (import)
    exam1과 바인딩
<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />
<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20" />
<bean id="console" class="spring.di.ui.InlineExamConsole" >
</bean>

[실행결과]

total is 20, avg is 5.000000

 


@Autowired의 위치

@Autowired는 setter위 뿐만 아닌 오버로드생성자 위, 필드 위에서도 사용 가능하다

1.기본생성자에서 객체를 바인딩

public class InlineExamConsole implements ExamConsole {

	@Autowired
 	@Qualifier("exam2")   
	private Exam exam;
    
	public InlineExamConsole() {
	}    
	
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}

//	@Autowired
//	@Qualifier("exam2")
	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

※ 기본 생성자가 없고 오버로드 생성자만 있는 경우 인젝션이 되지 않지만,

    기본 생성자도 없고 오버로드 생성자도 없는 경우 컴파일러가 기본 생성자를 자동으로 만들어 주기 때문에 가능하다.

 

ex)

public class InlineExamConsole implements ExamConsole {

	@Autowired
 	@Qualifier("exam2")   
	private Exam exam;
    
//	public InlineExamConsole() {
//	}    
	
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}
  • error
public class InlineExamConsole implements ExamConsole {

	@Autowired
 	@Qualifier("exam2")   
	private Exam exam;
    
//	public InlineExamConsole() {
//	}    
	
//	public InlineExamConsole(Exam exam) {
//		this.exam = exam;
//	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}
  • 기본생성자를 컴파일러가 자동으로 생성

2. overload에서 객체를 바인딩

public class InlineExamConsole implements ExamConsole {

	private Exam exam;
    
	public InlineExamConsole() {
	}    
	
	@Autowired
	@Qualifier("exam2")    
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}

//	@Autowired
//	@Qualifier("exam2")
	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

※overload생성자에서는 다수의 Exam이 들어갈 수 있기 때문에

   @Qualifier를 각자 지정할 수 있게끔 파라미터에 설정해준다.

 

ex)

public class InlineExamConsole implements ExamConsole {

	private Exam exam;
    
	public InlineExamConsole() {
	}    
	
	@Autowired
//	@Qualifier("exam2")      
	public InlineExamConsole(@Qualifier("exam2")Exam exam) {
		this.exam = exam;
	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

 


@Autowired(required = false) : xml에 객체가 없더라도 실행

<!-- <bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" /> -->
<!-- <bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20" /> -->
<bean id="console" class="spring.di.ui.InlineExamConsole" >
</bean>
@Autowired(required = false)
@Qualifier("exam2")
private Exam exam;
    
@Override
public void print() {
	if(exam == null)
		System.out.printf("total is %d, avg is %f\n", 0, 0.0);
	else
		System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
}
  • xml파일의 exam1, exam2객체를 지운 후InlineExamConsole.java파일의 @Autowired에 (required = false)옵션 추가

[실행결과]

total is 0, avg is 0.000000

 


@Component : IoC 컨테이너에 스프링 빈으로 등록 

  •  xml에 <context:component-scan base-package="패키지명"/> 추가 필요
    (쉼표(,)를 사용해 다수의 패키지명 추가 가능)
    : 해당 패키지명 안에 있는 클래스를 스캔해서 컴퍼넌트가 있다면 객체화 시켜준다
    ※ <context:annotation-config /> 태그는 필요가 없어진다
  • 용도에 따라 주로 @Controller, @Service, @Repository로 사용한다

 

@Component("console")
  • xml 파일 <bean id="console"> 태그의 id와 같이 이름을 "console"로 지정

@Value : 기본 값 설정

@Component
public class NewlecExam implements Exam {

	@Value("20")
	private int kor;
	@Value("30")
	private int eng;
	private int math;
	private int com;

xml파일의 내용을 어노테이션을 통해 자바에 설정하기

<beans xmlns="http://www.springframework.org/schema/beans" ...>
	<context:component-scan base-package="spring.di.ui, spring.di.entity" />
	<bean id="exam" class="spring.di.entity.NewlecExam" />
@ComponentScan("spring.di.ui")
@Configuration
public class NewlecDIConfig {
	
	@Bean
	public Exam exam() {	//id="exam"
		return new NewlecExam();
	}
}
  • @ComponentScan : 해당 패키지명 안에 있는 클래스를 스캔해서 컴퍼넌트가 있다면 객체화 시켜준다
    @Configuration : 스프링 컨테이너를 만드는 데에 사용
    @Bean : 컨테이너에 담는 데에 사용
ApplicationContext context = 
	new AnnotationConfigApplicationContext(NewlecDIConfig.class);
//	new ClassPathXmlApplicationContext("spring/di/setting.xml");
  • Program.java파일 내 ApplicationContext 수정
    : AnotationConfigApplicationContext을 통해 클래스를 대입
728x90
List<Exam> exams = new ArrayList<>();
exams.add(new NewlecExam(1,1,1,1));

for (Exam e : exams)
	System.out.println(e);

위 ArrayList를 xml에서 생성하기

1. 

<bean id= "exams" class="java.util.ArrayList" />
  • xml에 위 코드 추가
List<Exam> exams = (List<Exam>) context.getBean("exams");//new ArrayList<>();
exams.add(new NewlecExam(1,1,1,1));

for (Exam e : exams)
	System.out.println(e);
  • new ArrayList<>(); 를 context.getBean("exams"); 로 수정 후 형변환 (List<Exam>)

[실행결과]

NewlecExam [kor=1, eng=1, math=1, com=1]

2.

<bean id = "exams" class="java.util.ArrayList">
	<constructor-arg>
		<list>
			<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />
			<ref bean = "exam"/>
		</list>
	</constructor-arg>
</bean>
  • xml <bean>태그 안쪽에 위 코드 추가
List<Exam> exams = (List<Exam>) context.getBean("exams");
//exams.add(new NewlecExam(1,1,1,1));

for (Exam e : exams)
	System.out.println(e);
  • xml에서 초기화 하였기 때문에 exams.add(new NewlecExam(1,1,1,1)); 삭제

[실행결과]

NewlecExam [kor=1, eng=1, math=0, com=0]

3.

xml하단탭 Namespaces 클릭 후 util 체크

 

OK

 

다시 Source로가서 추가된 열 확인

 

<util:list id = "exams" list-class="java.util.ArrayList">
	<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />
	<ref bean = "exam"/>
</util:list>

<!-- <bean id = "exams" class="java.util.ArrayList">
	<constructor-arg>
		<list>
			<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />
			<ref bean = "exam"/>
		</list>
	</constructor-arg>
</bean> -->

util을 사용하여 재생성

 

※ <list> : 목록을 셋팅할 때 사용, 자체만으로 객체를 만들수 없다

   <util:list> : 객체를 만들 수 있다.

728x90

spring.di 패키지 우클릭 → New → Other...

 

Spring폴더 Spring Bean Configuration File → Next >

 

File name 작성 후 Finish


1. property

Setter메소드를 통해 값을 설정

<?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">
	
   	<!-- Exam exam = new NewlecExam(); -->
	<bean id="exam" class="spring.di.entity.NewlecExam" />
		<!-- NewlecExam에 get, set 필요 -->
		<property name="kor" value="10" />
		<property name="eng" value="10" />
		<property name="math" value="10" />
		<!-- 이렇게도 사용 가능 -->
		<property name="com">
			<value>10</value>
		</property>
    
    
   	<!-- ExamConsole console = new InlineExamConsole();  -->
	<bean id="console" class="spring.di.ui.InlineExamConsole" >
		
		<!-- console.setExam(exam); -->
		<property name="exam" ref="exam"/>
	</bean>
	
</beans>
  • <bean>태그 : 생성할 객체 지시

    id : 어떠한 이름으로 사용할 것인지(변수명) 입력

    class : 객체화 할 클래스
    (※중복을 방지하기 위해 패키지명까지 같이 입력)

  • <property>태그 : 함수 호출 (set 생략)

    name : 호출할 함수의 이름
    (※setExam 을 property명으로 대신하여 set을 생략하고 exam으로 바뀜)

    ref : name에 들어올 객체의 이름 (타입이 reference형식일 경우 사용)
    (exam의 속성은 spring.di.entity.NewlecExam 즉 reference형식)

    value : name에 들어올 객체의 이름 (타입이 value형식일 경우 사용)
    ( ex) 10, 15, 20.. 숫자)
package spring.di;

//import spring.di.entity.Exam;
//import spring.di.entity.NewlecExam;
//import spring.di.ui.ExamConsole;
//import spring.di.ui.GridExamConsole;
//import spring.di.ui.InlineExamConsole;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.ui.ExamConsole;


public class Program {

	public static void main(String[] args) {
		
       		 /* 스프링에게 지시하는 방법으로 코드 변경
		Exam exam = new NewlecExam();
		ExamConsole console = new InlineExamConsole(exam);
		ExamConsole console = new GridExamConsole(exam);
    		*/
        
		//Maven 라이브러리 가져온 후 import
		ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
		
//		ExamConsole console = (ExamConsole) context.getBean("console");
		ExamConsole console = context.getBean(ExamConsole.class);
		console.print();
	}

}
  • [ ExamConsole console = (ExamConsole) context.getBean("console"); ] 의 형식으로 사용할 경우
    (이름으로 꺼낼 경우) object형으로 꺼내지기 때문에 캐스팅(형식 변환)을 해주어야 한다 - 번거롭다

  • [ ExamConsole console = context.getBean(ExamConsole.class); ] 의 형식으로 사용할 경우
    (자료형명으로 꺼낼 경우) 캐스팅을 해줄 필요가 없다. - 주로 선호된다

[실행결과]

total is 40, avg is 10.000000

 

 

 

2. constructor-arg

Constructor(생성자)를 통해 값을 설정

 

<?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="exam" class="spring.di.entity.NewlecExam">
		<!-- NewlecExam에 consturctor 추가 -->
		<!-- <constructor-arg index="0" value = "10" /> -->
		<!-- <constructor-arg index="1" value = "20" /> -->
		<!-- <constructor-arg index="2" value = "30" /> -->
		<!-- <constructor-arg index="3" value = "40" /> -->
		<constructor-arg name="kor" value = "10" />
		<constructor-arg name="eng" value = "20" />
		<constructor-arg name="math" value = "30" />
		<constructor-arg name="com" value = "40" />
	</bean>
	<bean id="console" class="spring.di.ui.InlineExamConsole" >
		<property name="exam" ref="exam"/>
	</bean>
	
</beans>

<constructor-arg>태그에 index를 사용할 경우 값을 헷갈릴 수 있기 때문에 name을 통해 명시적으로 표현한다

 

+

 

자료형이 다를 경우 type속성을 추가로 설정해 줄 수 있다.

 

ex)

<constructor-arg name="kor" type = "float" value = "10" />
<constructor-arg name="eng" type = "float" value = "20" />
<constructor-arg name="math" type = "float" value = "30" />
<constructor-arg name="com" type = "float" value = "40" />

 

☆☆☆☆ constructor 간편하게 생성하는 법 ☆☆☆☆

constructor를 생성하고자하는 위치 우클릭 → Source → Generate Constructor using Fields...

 

Select All 해준 후 Generate

 

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

 

3. 속성 설정

constructor를 사용할 때 태그가 너무 번잡하여 쉽게 사용하기 위해 사용

 

단일태그에 접두사p:속성명 을 입력하여 설정가능

 

설정이 필요한 xml파일 하단 Namespaces 클릭 → p에 체크

※Namespaces : 이름을 식별하기위해 붙여지는 접두사

 

OK

 

 

다시 Source로가서 추가된 열 확인

 

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="20" p:math="30" p:com="40"/>
	<!-- <bean id="exam" class="spring.di.entity.NewlecExam">
		<constructor-arg name="kor" value = "10" />
		<constructor-arg name="eng" value = "20" />
		<constructor-arg name="math" value = "30" />
		<constructor-arg name="com" value = "40" />
	</bean> -->
	<bean id="console" class="spring.di.ui.InlineExamConsole" >
		<property name="exam" ref="exam"/>
	</bean>
	
</beans>

'spring' 카테고리의 다른 글

어노테이션 (Annotation)  (0) 2021.09.08
Collection 생성  (0) 2021.08.30
Maven Repository 라이브러리 가져오기  (0) 2021.08.29
ApplicationContext의 종류  (0) 2021.08.29
스프링 플러그인 설치하기, 파일추가하기  (0) 2021.08.26
728x90

1. 이클립스 내부에서 가져오기

상단메뉴 Window탭 Show View → Other...

 

Maven폴더 → Maven Repositories → Open

 

이클립스 하단 Maven Repositories탭 Global Repositories → central (http://repo.maven.apache.org/maven2) 우클릭 →

Rebuild Index 

※약 1시간정도 소요

 

바꾸고자 하는 프로젝트 우클릭 → Configure → Convert to Maven Project

 

Group Id, Artifact Id 설정 후 Finish

 

추가된 pom파일 하단메뉴 Dependencies 클릭 후 Add... 

 

springframework 검색

 

 

 

2. 직접 사이트에 들어가 가져오기

https://mvnrepository.com/

 

위 사이트 접속

 

상단 메뉴바에 springframework 검색

 

Spring Context 클릭

 

최신버전 (위 그림에서는 5.3.9) 클릭

 

해당 코드 클릭 (자동으로 클립보드로 복사)

 

pom.xml파일의 version태그와 build태그 사이에 붙여넣기

'spring' 카테고리의 다른 글

Collection 생성  (0) 2021.08.30
DI 지시서 작성하기 (property, constructor-arg)  (0) 2021.08.29
ApplicationContext의 종류  (0) 2021.08.29
스프링 플러그인 설치하기, 파일추가하기  (0) 2021.08.26
IoC 컨테이너  (0) 2021.08.26

+ Recent posts