뮁이의 개발새발
[Spring] 의존성 주입 (Dependency Injection) 본문
[싱글톤 빈]
- 스프링 빈은 기본적으로 싱글톤으로 만들어짐.
그러므로, 컨테이너가 제공하는 모든 빈의 인스턴스는 항상 동일함.
컨테이너가 항상 새로운 인스턴스를 반환하게 만들고 싶을 경우 scope를 prototype으로 설정해야 함.
<bean id="memberService" class="com.mueng.test.service.MemberServiceImpl" scope="prototype"/>
[빈의 생성 범위]
[스프링 빈 설정: XML]
- XML문서의 형태로 빈의 설정 메타정보를 기술.
- 단순하며 사용하기 쉽고 직관적임, 가장 많이 사용하는 방식
- <bean> 태그를 통해 세밀한 제어 가능
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="ds" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/ssafy"></property>
</bean>
<bean id = "sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"></property>
<property name="typeAliasesPackage" value="com.ssafy.item.model"></property>
<property name="mapperLocations" value="classpath:mapper/*.xml">
</property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean"></constructor-arg>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
[Annotation]
- 어플리케이션의 규모가 커지면 XML 파일을 관리하는 것이 번거로움
- 빈으로 사용될 클래스에 특별한 annotation을 부여해 주면 자동으로 빈 등록 가능
@Autowired
private MemberDao memberDao;
- Annotation으로 빈을 설정 할 경우 반드시 component-scan을 설정 해야 함.
<context:component-scan base-package='com.test.hello."/>
[스테레오 annotation 종류]
@Repository : Data Access Layer의 DAO 또는 Repository 클래스에 사용./ DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해 사용.
@Service : Service Layer의 클래스에 사용.
@Controller: Presentation Layer의 MVC Controller에 사용. / 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정.
@Component : 위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정.
[DI]
- 객체간의 의존관계를 자신이 아닌 외부의 조립기가 수행
- 제어의 역행(inversion of Control, IoC)이라는 의미로 사용.
- DI를 통해 시스템에 있는 각 객체를 조정하는 외부 객체가 객체들에게 생성시에 의존관계를 주어짐
- 느슨한 결합의 주요 강점: 객체는 인터페이스에 의한 의존 관계만을 알고 있으며, 이 의존 관계는 구현 클래스에 대한 차이를 모르는 채 서로 다른 구현으로 대체가 가능.
------------------Spring--------------------
[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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
- 기본 속성
- name : 주입 받을 곳에서 호출 할 이름 설정
- id : 주입 받을 곳에서 호출 할 이름 설정(유일 값).
- class : 주입 할 객체의 클래스
[빈 의존 관계 설정]
1. constructor 이용
<constructor-arg> : <bean>의 하위태그로 설정한 bean 객체 또는 값을 생성자를 통해 주입하도록 설정.
- 설정 방법: <ref>, <value>와 같은 하위태그를 이용하여 설정하거나 또는 속성을 이용하여 설정.
public Player(int num, String name){
this.num = num;
this.name = name;
}
<bean id = "payer1" name="p1,py1" class="com.test.di.Player">
<constructor-arg value ="31"/>
<constructor-arg name="name" value ="김민정"/>
</bean>
* 순서대로 작성하면 됨. 순서를 지키지 않을 시, 속성(type, index, name)을 이용하여 match 시켜준다.
2. Property 이용
<property>: <bean>의 하위태그로 설정한 bean 객체 또는 값을 property를 통해 주입하도록 설정.
- 설정 방법: <ref>, <value>와 같은 하위태그를 이용하여 설정 하거나 속성을 이용하여 설정
- 하위태그 이용
- 객체 주입 시: <
'Back-end' 카테고리의 다른 글
[VueJS] 기본 개념 및 요점정리 (0) | 2021.11.15 |
---|---|
[my batis] 기본 개념 및 Spring 연동 (0) | 2021.11.08 |
[MVC 패턴] 기초개념 (0) | 2021.10.18 |
[HttpSession] 기초 개념 (0) | 2021.10.14 |
[Cookie] 기초 개념 및 구현 (0) | 2021.10.14 |