자동으로 의존 객체 주입하기
기존 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("이미존재합니다");
}
}
반응형
'자바 공부 > 스프링공부' 카테고리의 다른 글
리액트 스프링부트를 이용한 토이프로젝트 및 공부 (0) | 2024.05.19 |
---|---|
컨트롤러,Service,DAO (0) | 2024.05.15 |
JDBCTemplate 사용하기 (0) | 2024.05.13 |
스프링 DI,IOC 사용해보기 (0) | 2024.05.09 |
스프링 DI와 IOC (0) | 2024.05.08 |