2020년 10월 4일 일요일

스프링 다중XML설정파일, XML import, XML설정파일의분리(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)

 

스프링 다중XML설정파일, XML import, XML설정파일의분리(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)


http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=866



스프링 다중XML설정파일, XML import, XML설정파일의분리(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)



https://youtu.be/9nDddqIFrf8





스프링 다중XML설정파일, XML import, XML설정파일의분리(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)


1. 다중 XML 설정 파일

크고 복잡한 Spring 기반 애플리케이션의 경우 애플리케이션의 XML 설정(빈 정의)을 더 작은 조각으로 모듈화하여 유지 관리를 쉽게하기도 합니다.

여러 개의 XML 파일을 ApplicationContext 생성시 하나씩 로딩 할 수 있습니다. 새 파일을 추가해야 하는 경우 소스코드를 변경해야한다.

ApplicationContext factory = new ClassPathXmlApplicationContext("controller.xml","service.xml","dao.xml");

<import> 요소를 이용하면 설정파일을 단일 XML 파일로 구성 할 수 있습니다. 하나의 XML 파일에 아래 내용을 기술하고 그 파일만 로딩하면 된다.

[applicationContext.xml]

<import resource="dao.xml" />

<import resource="service.xml" />

<import resource="controller.xml" />

ApplicationContext factory = new ClassPathXmlApplicationContext(“applicationContext.xml");

2. 실습

사진 삭제

자바/스프링프레임워크/자바교육/스프링교육/스프링동영상


사진 삭제

자바/스프링프레임워크/자바교육/스프링교육/스프링동영상


사진 설명을 입력하세요.

project name : multixml

--------------------- pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>multixml</groupId>

<artifactId>multixml</artifactId>

<version>0.0.1-SNAPSHOT</version>

<name>multixml</name>

<description>multixml</description>

<properties>

<java-version>1.8</java-version>

<org.springframework-version>5.2.9.RELEASE</org.springframework-version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${org.springframework-version}</version>

</dependency>

</dependencies>

</project>

-------------------- Emp.java

package multixml;

public class Emp {

private String empno;

private String ename;

public Emp(String empno, String ename) {

super();

this.empno = empno;

this.ename = ename;

}

@Override

public String toString() {

return "Emp [empno=" + empno + ", ename=" + ename + "]";

}

public String getEmpno() {

return empno;

}

public void setEmpno(String empno) {

this.empno = empno;

}

public String getEname() {

return ename;

}

public void setEname(String ename) {

this.ename = ename;

}

}

-------------------- EmpDao.java

package multixml;

import java.util.ArrayList;

import java.util.List;

public class EmpDao {

public List<Emp> getAllEmps() {

List<Emp> emps = new ArrayList<Emp>();

emps.add(new Emp("1", "이종철"));

emps.add(new Emp("2", "오라클자바커뮤니티"));

return emps;

}

}

------------------- EmpService.java

package multixml;

import java.util.List;

public class EmpService {

private EmpDao empDao;

public void setEmpDao(EmpDao empDao) {

this.empDao = empDao;

}

public List<Emp> getAllEmps() {

return empDao.getAllEmps();

}

}

-------------------- EmpController.java

package multixml;

import java.util.List;

public class EmpController {

private EmpService empService;

public void setEmpService(EmpService empService) {

this.empService = empService;

}

public void getAllEmps() {

List<Emp> emps = empService.getAllEmps();

emps.forEach( emp -> System.out.println(emp) ); //jdk 1.8이상

}

}

------------------ EmpTest.java

package multixml;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EmpTest {

public static void main(String[] args) {

ApplicationContext factory = new ClassPathXmlApplicationContext("controller.xml","service.xml","dao.xml");

//ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");

EmpController empController = factory.getBean(EmpController.class);

empController.getAllEmps();

}

}

------------------ applicationContext.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"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<import resource="dao.xml" />

<import resource="service.xml" />

<import resource="controller.xml" />

</beans>

------------------- dao.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"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="empDao" class="multixml.EmpDao" />

</beans>

------------------- service.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"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="empService" class="multixml.EmpService ">

<property name="empDao" ref="empDao" />

</bean>

</beans>

-------------------- controller.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"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="empController" class="multixml.EmpController">

<property name="empService" ref="empService" />

</bean>

</beans>

[실행결과]

Emp [empno=1, ename=이종철]

Emp [empno=2, ename=오라클자바커뮤니티]



#스프링설정파일, #XML파일분리, #스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원



스프링 XML설정 ref bean, ref local차이, 빈정의시 id와 name의 차이(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)


스프링 XML설정 ref bean, ref local차이, 빈정의시 id와 name의 차이(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)   

 

 

n  bean vs local

 

<bean id="empService" class="xmlinjection.EmpService">

      <constructor-arg ref="empDao"/>

      <constructor-arg><ref bean="empDao"/> </constructor-arg>

      <constructor-arg><ref local="empDao"/> </constructor-arg>

</bean>

 

<ref bean=“onjBean”/>

 

가장 일반적인 형태동일한/상위 BeanFactory or ApplicationContext 내에서 자바 빈을 검색물론 동일한 XML 설정 파일 내부가 아니더라도 관계 없다찾고자 하는 onjBean id, name 어느 것이나 정의되어 있으면 된다.

 

<ref local= “onjBean” />

 

동일한 XML 설정 파일내에서 onjBean을 검색하며 onjBean bean정의의 id로 검색하며, Spring4에서 local을 더 이상 사용하지 않는다스프링이상이라면 <ref bean=“”/>을 사용하자.

 

n  빈 정의시 id  name의 차이

ü  id or name은 하나의 XML 파일에서는 하나만 정의가능(유일). 중복되면 안됨

ü  하나의 XML 파일, bean정의에는 id, name에 중복 이름 사용 가능.

<bean id="designername="emp,designer" class="idnametest.Designer"/>

ü  XML 파일이 다르면 id, name 중복 정의가능뒤에 로딩되는 파일의 빈이 선택된다.

(XML작성시 오류발생 하지 않지만 실행하여 XML 로딩시 중복 선언 오류발생)

<bean id="emp" name = "designer" class="idnametest.Designer"/>

<bean id="emp" class="idnametest.Programmer"/>

 

ü  id는 오로지 하나, name은 여러 개 정의 가능하다.

       <bean id="foo" name = "foo1, foo2" class="ojc.Foo"/>

 

   Foo f1 = (Foo) context.getBean("foo");

   Foo f2 = (Foo) context.getBean("foo1");

   Foo f3 = (Foo) context.getBean("foo2");

 

ü  다른 설정파일에 id, name이 같은 빈을 정의할 수 있다.

[bean1.xml]

<bean id="foo" name = "king, queen" class="ojc.Foo"/>

 

[bean2.xml]

<bean id="bar" name = "king" class="ojc.Bar"/>

 

FileSystemXmlApplicationContext context =

   new FileSystemXmlApplicationContext(new String[] { "beans2.xml", "beans1.xml" });

Foo f = (Foo) context.getBean("king");

 

bean1.xml 파일이 나중에 로딩되므로 bean1.xml king이 로드된다.

 

 

 

 

 

[실습]

 

 

package idnametest;


public abstract class Emp {

public abstract void work();

}



package idnametest;

import javax.annotation.PostConstruct;

public class Designer extends Emp {
@PostConstruct
public void afterNew() {
System.out.println("Designer Created...");
}
public void work() {
System.out.println("Designer working...");
}
}


package idnametest;

import javax.annotation.PostConstruct;

public class Programmer extends Emp{
@PostConstruct
public void afterNew() {
System.out.println("Programmer Created...");
}

public void work() {
System.out.println("Programmer working...");
}
}


package idnametest;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EmpTest {
public static void main(String[] args) {
// EmpConfig.java 파일 안에 있는 @Bean으로 정의된 빈을 로딩
// 기본적으로 Pre-Loading
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:emp2.xml", "classpath:emp1.xml");        
        System.out.println("ApplicationContext 초기화...");
         
        Emp emp1 = (Emp)ctx.getBean("programmer");
        emp1.work();
        
        Emp emp2 = (Emp)ctx.getBean("designer");
        emp2.work();
        
        Emp emp3 = (Emp)ctx.getBean("emp");
        emp3.work();
}
}



-- emp1.xml

<?xml version="1.0" encoding="UTF-8"?>

    <bean id="programmer" name = "emp,programmer" class="idnametest.Programmer"/>
    
</beans>



-- emp2.xml

<?xml version="1.0" encoding="UTF-8"?>

    <bean id="designer" name = "emp,designer" class="idnametest.Designer"/>
    
</beans>






 

실행

ApplicationContext 초기화...

Programmer working...

Designer working...

Programmer working...

 

 

#refbean, #reflocal, #스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원   

2020년 10월 3일 토요일

스프링의 자바빈 로딩(사전로딩, 지연로딩, Pre-Loading, Lazy-Loading),@Lazy 어노테이션(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원)

 스프링의 자바빈 로딩(사전로딩, 지연로딩, Pre-Loading, Lazy-Loading),@Lazy 어노테이션(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원)


http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=864




스프링의 자바빈 로딩(사전로딩, 지연로딩, Pre-Loading, Lazy-Loading),@Lazy 어노테이션(스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원)



https://youtu.be/R3iQnppqa74




1. 스프링의 자바 빈 로딩

기본적으로 Spring의 ApplicationContext, WebApplicationContext는 애플리케이션을 시작할 때 모든 싱글톤 빈을 생성하고 초기화 합니다. (Pre-Loading)

대부분의 경우 초기 단계에서 빈 의 설정문제를 감지하는 데 도움이 됩니다.

그러나 때로는 다른 프로젝트 요구 사항으로 인해 일부 또는 모든 빈을 지연로딩(실제 요청이 있을 때) 초기화 할 수도 있습니다.

Spring은 Lazy-Loading을 위한 XML 기반 또는 Java Config 같은 두 가지 방법을 제공합니다.

스프링 설정 파일에 여러 개의 자바 빈이 정의되었다고 모두 자주 사용되는 것은 아닐 수 있고 이러한 경우 실제 요청이 있을 때 자바 빈을 로딩하는 것이 좋을 것입니다.

2. BeanFactory(Lazy-Loading)

BeanFactory를 이용한 빈의 로딩은 기본적으로 Lazy-Loading 입니다.

BeanFactory factory = new XmlBeanFactory( new InputStreamResource(

new FileInputStream(“emp.xml"))); // 1

EmpService ojc = (EmpService) factory.getBean(“empService"); // 2

1번에서 BeanFactory 컨테이너에 의해 emp.xml 파일이 로드되더라도 어떠한 빈도 인스턴스화 되지 않고 2번에서 empService 빈이 요청을 받는 시점에 인스턴스화 되고 로드된다.

3. ApplciationContext(Pre-Loading)

모든 빈들이 ApplicationContext 컨테이너에 의해 설정파일이 로드될 때 인스턴스로 만들어지고 로드 된다.

ApplicationContext ctx = new ClassPathXmlApplicationContext(“emp.xml"); // 1

EmpService ojc = (EmpService) factory.getBean(“empService"); // 2

1번에서 모든 싱글톤 빈들이 인스턴스화 된다. 그러므로 빈이 여러 개라면 시간이 소요될 것이다. 2번에서는 미리 Spring IoC 컨테이너에서 만들어진 빈들이 클라이언트로 리턴된다.

4. 자바 설정에서 @Lazy - 1

@Configuration

public class AppConfig {

@Lazy //아래빈은 지연로딩

@Bean

public EmpService empServiceImpl() {

return new EmpServiceImpl();

}

@Bean //아래빈은 즉시 로딩

public EmpDao empDaoImpl() {

return new EmpDaoImpl();

}

}

5. 자바 설정에서 @Lazy - 2

// AppConfig 파일에서 로딩하는 모든 빈을 지연로딩 시킨다.

@Lazy

@Configuration

public class AppConfig {

@Bean

public EmployeeManager employeeManager() {

return new EmployeeManagerImpl();

}

…….

}

6. @Autowired와 지연로딩

지연로딩을 위한 빈 정의 와 @Autowired가 사용되는 두 곳 모두 @Lazy 가 사용되어야 합니다.

@Lazy

@Service

publlic class EmpServiceImpl implements EmpService { … }

@Controller

public class EmpController {

@Lazy

@Autowired

EmpService empService;

……

}

7. XML 설정에서 지연로딩

스프링의 빈 정의 XML 파일에서 lazy-init=“true”라고 표시하면 됩니다.

<bean id=“empService” class=“ojc.EmpServiceImpl” lazy-init=“true”/>

XML 파일에서 정의하는 모든 빈들을 지연 로딩 하려면 beans 태그에 default-lazy-init=“true”로 표시하면 됩니다.

<beans default-lazy-init=“true”>

<bean id=“empService” class=“ojc.EmpServiceImpl”/>

</beans>

#스프링프레임워크 , #자바, #Spring Framework


#스프링프레임워크 , #자바, #Spring Framework


#@Lazy, #preloading, #lazyloading, #지연로딩, #즉시로딩, #스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원



(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...