자바 공부/스프링공부

자동으로 의존 객체 주입하기

ari0930 2024. 5. 10. 17:42

자동으로 의존 객체 주입하기

기존 Bean코드

 

<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="userDao" class="test_pj_01.dao.UserDao"></bean>


	<bean id="userinsert" class="test_pj_01.service.Userinsert">
		<constructor-arg ref="userDao"></constructor-arg>
	
	</bean>

 

자동의로 의존 객체를 주입하기 위한 빈 코드 

 

바꿀 부분

<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.xsd">
    <context:annotation-config/>
	<bean id="userDao" class="test_pj_01.dao.UserDao"></bean>


	<bean id="userinsert" class="test_pj_01.service.Userinsert" />

전체 코드

<?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.xsd">
    <context:annotation-config/>
	<bean id="userDao" class="test_pj_01.dao.UserDao"></bean>

	<bean id="userinsert" class="test_pj_01.service.Userinsert" />
	

	
</beans>

기존에 있던 <constructor-arg ref="userDao"></constructor-arg> 이 부분이 생략할 수 있게 되었다.

 

이번에 @Autowired를 이용한 객체 자동주입

생성자가 여러 개인 경우 

만약 기본생서자가 있는 경우

package test_pj_01.service;

import test_pj_01.dao.UserDao;
import test_pj_01.user.User;

public class Userinsert {
	private UserDao usersDao;
	
	public Userinsert() {
		System.out.println("기본생성자");
		
	}
	
	public Userinsert(UserDao usersDao) {
		this.usersDao = usersDao;
	}

	public void useinsert(User user) {
		User user_v = usersDao.select(user.getNum());
		if (user_v==null) {
			usersDao.insert(user);
			System.out.println("추가완료");
		}
		else {
			System.out.println("이미존재합니다");
		}
		
	}
	

}

이 코드를 실행시켜 보면

기본 생성자 디폴트 생성자가 호출되어 내가 작성한 다른 코드하고 연결이 되지 않아 오류가 뜬다. 

나는 코드를 작성할 때 이 클래스의 기본 생성자를 기반으로 코드를 작성하지 않았기 때문이다. 그럼 내가 원하는 생성자에 객체를 주입하기 위해서는 어떻게 해야 할까?

 

내가 사용하고자 하는 생성자 위에 @Autowired를 작성하면 된다.

이렇게 하고 난 후 실행하면 아무런 문제 없이 잘 돌아간다.

@Autowired 적용대상

생성자뿐만 아니라 필드와 메서드에도 적용이 가능하다.

 

필드에 적용

package test_pj_01.service;

import java.util.List;

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

import test_pj_01.dao.UserDao;
import test_pj_01.user.User;

public class UserShow {
	@Autowired
	private UserDao usersDao;

//	public UserShow(UserDao usersDao) {
//		this.usersDao = usersDao;
//	}
	
	public void useshow() {
		List<User> users = usersDao.show();
		for (int i=0; i<users.size(); i++) {
			System.out.println(users.get(i).getName());
			
		}
	}
	
}

이렇게 필드에 @Autowired를 사용하면 객체를 사용하는 생성자가 없어도 자동으로 만들어 주입해 준다.

 

메서드에서의 적용

생성자에 적용할 때와 마찬가지로 메서드 위에 적용하면 적용이 된다.

 

 

다수의 빈 객체 중 의존 대상 객체 선택 방법

 

bean 코드

	<bean id="userDao1" class="test_pj_01.dao.UserDao"></bean>
	<bean id="userDao2" class="test_pj_01.dao.UserDao"></bean>
	<bean id="userDao3" class="test_pj_01.dao.UserDao"></bean>

	<bean id="userinsert" class="test_pj_01.service.Userinsert">
		<qualifier value="userDao1"></qualifier>
		</bean>

	<bean id="userShow" class="test_pj_01.service.UserShow" >
			<qualifier value="userDao1"></qualifier>
		</bean>

qualifier로 내가 원하는 빈을 선택해줘야 한다.

선택해 줬다면

 

package test_pj_01.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import test_pj_01.dao.UserDao;
import test_pj_01.user.User;

public class UserShow {
	@Autowired
	@Qualifier("userDao1")
	private UserDao usersDao;

//	public UserShow(UserDao usersDao) {
//		this.usersDao = usersDao;
//	}
	
	public void useshow() {
		List<User> users = usersDao.show();
		for (int i=0; i<users.size(); i++) {
			System.out.println(users.get(i).getName());
			
		}
	}
	
}

필드에 사용할 경우 @Autowired 아래에도 @qualifer ("value값")을 작성해서 넣어줘야 한다

 

생성자에 사용할 경우 아래처럼 매개변수 앞에  @qualifer ("value값") 넣어줘야 한다.

package test_pj_01.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import test_pj_01.dao.UserDao;
import test_pj_01.user.User;

public class Userinsert {
	private UserDao usersDao;
	
	public Userinsert() {
		System.out.println("기본생성자");
		
	}
	
	@Autowired
	
	public Userinsert(@Qualifier("userDao1")UserDao usersDao) {
		this.usersDao = usersDao;
	}

	public void useinsert(User user) {
		User user_v = usersDao.select(user.getNum());
		if (user_v==null) {
			usersDao.insert(user);
			System.out.println("추가완료");
		}
		else {
			System.out.println("이미존재합니다");
		}
		
	}

 

 

반응형