p 라는 접두어를 이용하여 property 작성하기
- 먼저 beans 태그에 네임 스페이스를 넣고 그 이후 p라는 접두어를 이용해서 다음과 같이 값을 넣는다.
- 예제 코드
package exam03;
public class SmsSender {
public void send() {
System.out.println("메세지를 전송하였습니다.");
}
}
package exam03;
public class SystemMonitor {
private long periodTime;
private SmsSender sender;
public void setPeriodTime(long periodTime) {
this.periodTime = periodTime;
}
public void setSender(SmsSender sender) {
this.sender = sender;
}
public void monitor() {
System.out.println(periodTime +"분 간격으로");
sender.send();
System.out.println("----------------------------------");
}
}
<?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="smsSender" class="exam03.SmsSender" />
<bean id="systemMonitor" class="exam03.SystemMonitor"
p:periodTime="10"
p:sender-ref="smsSender"
/>
</beans>
package exam03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("exam03/beans.xml");
SystemMonitor sm= (SystemMonitor)context.getBean("systemMonitor");
sm.monitor();
}
}
- 이 때 namespace 를 추가하여 p 를 추가할 수도 있다.
비식별자 전달하기
- 안에서 직접 객체를 생성하면 id 가 없이(비식별자) 생성할 수 있다.
- 예제 코드
package exam04;
public class DeptVO {
private int dno;
private String dname;
private String dloc;
public void setDno(int dno) {
this.dno = dno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setDloc(String dloc) {
this.dloc = dloc;
}
@Override
public String toString() {
return "DeptVO [dno=" + dno + ", dname=" + dname + ", dloc=" + dloc + "]";
}
}
package exam04;
public class DeptDAO {
private DeptVO deptVO;
public void setDeptVO(DeptVO deptVO) {
this.deptVO = deptVO;
}
public void insert() {
System.out.println("부서를 등록하였습니다.");
System.out.println(deptVO);
}
@Override
public String toString() {
return "DeptDAO [deptVO=" + deptVO + "]";
}
}
<?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="dao" class="exam04.DeptDAO">
<property name="deptVO">
<bean class="exam04.DeptVO">
<property name="dno" value="10" />
<property name="dname" value="개발 1팀" />
<property name="dloc" value="종각" />
</bean>
</property>
</bean>
</beans>
package exam04;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("exam04/beans.xml");
DeptDAO dao = (DeptDAO)context.getBean("dao");
dao.insert();
}
}
Java 컬렉션 프레임워크에서 list를 멤버로 가졌을 때 DI 와 XML
package exam05;
public interface Filter {
public void pro();
}
package exam05;
public class ZipFilter implements Filter {
@Override
public void pro() {
System.out.println("ZipFilter의 처리");
}
}
package exam05;
public class HeaderFilter implements Filter {
@Override
public void pro() {
System.out.println("HeaderFilter의 처리");
}
}
package exam05;
public class EncryptionFilter implements Filter {
@Override
public void pro() {
System.out.println("EncryptionFilter의 처리");
}
}
package exam05;
import java.util.List;
public class ProtocolHandler {
private List<Filter> filters;
public void setFilters(List<Filter> filters) {
this.filters = filters;
}
public void exec() {
for(Filter filter:filters) {
filter.pro();
}
}
}
<?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="zipFilter" class="exam05.ZipFilter" />
<bean id="encryptionFilter" class="exam05.EncryptionFilter" />
<bean id="ph" class="exam05.ProtocolHandler">
<property name="filters">
<list>
<ref local="encryptionFilter" />
<ref local="zipFilter" />
<bean class="exam05.HeaderFilter" />
</list>
</property>
</bean>
</beans>
package exam05;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("exam05/beans.xml");
ProtocolHandler ph= (ProtocolHandler)context.getBean("ph");
ph.exec();
}
}
의존 관계 자동 설정
- 의존관계가 복잡하거나 많아지게 되면 설정파일도 그만큼 복잡하고 커지게 된다.
- 의존 객체를 자동으로 설정하게 되면 설정 파일의 크기를 줄일 수 있다
- byName : 프로퍼티 이름과, 이미 생성된 이름과 같아야한다. 같지 않으면, 아래의 이미지와 같이 에러가 난다.
<?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="dao" class="exam06.MySqlArticleDao" />
<!-- ws 객체의 속성이름과 위의 이름이 dao 로 같으므로 자동으로 의존관계가 설정된다.-->
<bean id="ws" class="exam06.WriteArticleServiceImple"
autowire="byName"
/>
<!-- <bean id="ws" class="exam06.WriteArticleServiceImple">
<property name="dao" ref="dao" />
</bean> -->
</beans>
- byType : 프로퍼티 타입을 체크하여 자동으로 의존관계 설정된다.
- 동일 타입 객체 2개 이상이면 아래와 같이 예외 발생. 단, 동일한 타입 빈 객체 설정시 byType 할 수 있다.
<?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="mySqlArticleDao" class="exam07.MySqlArticleDao" />
<!-- <bean id="mySqlArticleDao2" class="exam07.MySqlArticleDao" /> -->
<bean id="ws" class="exam07.WriteArticleServiceImple"
autowire="byType"
/>
</beans>
- Constructor
- autodetect – 생성자를 먼저 적용하고, byType에 의한 설정
빈 객체 범위
package exam08;
public class Person {
private String name;
private int age;
public Person() {
System.out.println("생성자 동작함");
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
<?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="kim" class="exam08.Person"
p:name="김유신"
p:age="20"
/>
</beans>
package exam08;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
System.out.println("1");
ApplicationContext context = new ClassPathXmlApplicationContext("exam08/beans.xml");
System.out.println("2");
Person p1 = (Person)context.getBean("kim");
Person p2 = (Person)context.getBean("kim");
System.out.println("3");
//동일 객체인지 확인
if(p1 == p2) {
System.out.println("서로 같은 객체를 참조함");
}else {
System.out.println("서로 다른 객체를 참조함");
}
//테스트
p1.setAge(30);
System.out.println(p1);
System.out.println(p2);
}
}
별도의 객체를 생성했으면 싶을 때 Bean 객체 범위를 지정할 수 있다.
- sigleton : 스프링 컨테이너에 한 개의 객체만 존재(기본값)
- xml 을 읽어들일 때 생성
- prototype : 빈을 사용할 때 마다 생성
- getBean 할 때 마다 생성
<?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="kim" class="exam08.Person"
p:name="김유신"
p:age="20"
scope="prototype"
/>
</beans>
- request : http 요청 마다 생성(WebApplicationContext에서 적용)
- session : http 세션 마다 생성(WebApplicationContext에서 적용)
'Kosta DevOps 과정 280기 > Java' 카테고리의 다른 글
MVC 패턴과 DI (0) | 2024.08.01 |
---|---|
어노테이션 기반의 DI (0) | 2024.08.01 |
어제 복습 (0) | 2024.08.01 |
DI 의 필요성 (0) | 2024.07.31 |
스프링 베이직 시작 : 환경설정 (0) | 2024.07.31 |