Spring Framework -----> (1) Spring 개념의 심층 분석 및 제어 반전의 IoC 핵심 기술

하나, Spring 프레임 워크 란

1. 봄 개요 :

프로젝트 모듈 간 관리, 클래스와 클래스 간 관리를 용이하게하여 개발자가 개체를 만들고 개체 간 관계를 관리 할 수 ​​있도록 도와줍니다.

2. 봄 핵심 기술 :
(1) 제어 반전 (IoC)

IoC : 모듈과 클래스 간의 분리를 실현할 수 있습니다. 즉, 사용자가 사용할 객체를 만들 필요가 없습니다. 대신 자동으로 "주입"하는 Spring 컨테이너에 의해 관리되며 주입은 할당을 의미합니다.

(2) 측면 지향 프로그래밍 (AOP)

AOP : 시스템 수준 서비스의 재사용을 극대화하고 프로그래머는 더 이상 시스템 수준 서비스를 주 비즈니스 로직에 수동으로 "혼합"할 필요가 없으며 대신 Spring 컨테이너가 "위빙"을 완료합니다.

3. 장점 :
  • 1. 경량
  • 2. 인터페이스 프로그래밍을위한 디커플링
  • 3. AOP 프로그래밍 지원

둘째, IoC 제어 반전

1. IoC (Inversion of Control) : Inversion of Control은 이론, 개념 및 아이디어입니다.

(1) Inversion of control : 객체 생성, 속성 할당 및 종속성 관리는 모두 코드 외부의 컨테이너에 의해 구현됩니다. 즉, 객체 생성은 다른 외부 리소스에 의해 완료됩니다.

(2) 제어 : 객체 생성, 객체 속성 할당, 객체 간의 관계 관리.

(3) 역 분개 : 원래 개발자 관리 및 개체 생성 권한을 코드 외부의 컨테이너로 이전합니다. 컨테이너는 개발자 대신 개체를 관리합니다. 개체를 만들고 속성에 값을 할당합니다.

(4) 정 회전 : 개발자는 새로운 구성 방법을 사용하여 코드에서 객체를 생성하고 개발자가 객체를 능동적으로 관리합니다.

public static void main(String args[ ]){
    
    
     Student student = new Student( ); // 在代码中, 创建对象。
}

(5) 컨테이너 : 서버 소프트웨어, 프레임 워크 (봄)

2. 자바에서 객체를 생성하는 방법은 무엇입니까?
  • 1. 시공 방법, 새로운 대상
  • 2. 반사
  • 3. 직렬화
  • 4. 복제
  • 5. ioc : 컨테이너 생성 객체
  • 6. 동적 프록시

여기서 우리는 이전에 서블릿과 같은 ioc에 대한 개념도 배웠습니다.
1. HttpServelt를 상속 할 클래스를 생성합니다
. 2. web.xml에 서블릿을 등록하고 사용합니다.
< servlet-name> myservlet < /servlet-name>
< servelt-class>com.hcz.controller.MyServlet< /servlet-class >
3. 여기에 생성 된 Servlet 객체가 없습니다. no MyServlet myservlet = new MyServlet ()
4.이 Servlet 객체는 Tomcat 서버에 의해 생성됩니다. Tomcat은 컨테이너
5 라고도합니다. 컨테이너 로서의 Tomcat : 서블릿 개체, 리스너 및 필터 개체가 내부에 저장됩니다.

3. 왜 IoC를 사용합니까?

목적은 코드 변경을 줄이고 다른 기능을 달성하는 것입니다. 디커플링을 실현하십시오.

4. IoC 구현
  • DI (종속성 주입) 종속성 주입 :

도움을 받기 위해 다른 개체를 호출해야하는 경우 코드에서 호출 수신자를 만들 필요없이 프로그램에서 사용할 개체의 이름 만 제공하면됩니다. 개체가 컨테이너에서 생성되는 방법에 대해서는 할당, 검색은 모두 컨테이너 내부에서 구현되며 컨테이너에 의해 프로그램으로 전달됩니다.

  • Spring 프레임 워크는 종속성 주입을 사용하여 IoC를 구현합니다.

1. Spring은 객체를 관리하고 속성에 값을 할당하는 컨테이너입니다. 하단 레이어는 객체를 생성하는 리플렉션입니다
.2. Spring 컨테이너는 모든 Java 객체를 생성하고 관리하는 수퍼 팩토리입니다. 이러한 Java 객체를 Bean이라고합니다.
3. Spring 컨테이너 관리 컨테이너에있는 Bean 간의 종속성에 대해 Spring은 Bean 간의 종속성을 관리하기 위해 "dependency injection"을 사용합니다.

셋째, 첫 번째 Spring 프로그램 생성

(1) 먼저 메이븐 프로젝트 만들기

여기에 사진 설명 삽입

(2) Maven 종속성 pom.xml 소개
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.3.RELEASE</version>
</dependency>
(3) 인터페이스 및 엔티티 클래스 정의
public interface SomeService {
    
    
    public void doSome();
}
public class SomeServiceImpl implements SomeService {
    
    
    public SomeServiceImpl(){
    
    
        System.out.println("无参构造方法");
    }
    @Override
    public void doSome() {
    
    
        System.out.println("执行了SomeService的doSome方法");
    }
}
(4) Spring 설정 파일 생성
이제 src / main / resources / 디렉토리에 xml 파일을 생성합니다. 파일 이름은 임의로 지정할 수 있지만 Spring에서는 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">

    <bean id="someService" class="com.hcz.service.impl.SomeServiceImpl"/>
    <bean id="someService1" class="com.hcz.service.impl.SomeServiceImpl"/>

    <!--创建一个非定义类的对象-->
    <bean id="myDate" class="java.util.Date"/>
</beans>

분석 :
1. <bean> : 인스턴스 객체 생성에 사용, 인스턴스 객체는 빈 태그에 해당
2. id 속성 : 객체의 사용자 정의 이름, 고유 한 값, spring은이 id 값을 통해 인스턴스 객체를 찾습니다.
3. class Attribute : 클래스의 정규화 된 이름 (참고 : Spring은 객체를 생성하는 리플렉션 메커니즘이기 때문에 인터페이스가 될 수 없습니다. 클래스를 사용해야합니다)

Spring의 기본 구현 원칙 :
SomeService someService = new SomeServiceImpl();
Spring은 생성 된 객체를 맵에 넣습니다. spring 프레임 워크에는 객체를 저장할 맵이 있습니다. springMap.put (id 값, 객체),
예 :
springMap.put("someService",new SomeSerivceImp());

(5) 테스트 클래스 정의
/**
 * 1、不使用spring容器创建对象
 */
@Test
public void testSomeServiceOne(){
    
    
    SomeService service = new SomeServiceImpl();
    service.doSome();
}

/**
 * 2、使用spring容器创建对象
 */
@Test
public void testSomeServiceTwo(){
    
    
    
    //1.指定spring的配置文件
    String config = "bean.xml";
    //2.创建spring容器的【所有对象】,因为调用了它们各自的无参构造方法
    ApplicationContext context = new ClassPathXmlApplicationContext(config);
    //3.从容器中获取某个对象
    SomeService someService = (SomeService) context.getBean("someService");
    someService.doSome();
}

분석 :
1. ApplicationContext : IOC 컨테이너의 진입 점을 나타내며, 컨테이너 객체가 초기화되면 그 안의 모든 객체가 한 번에 어셈블됩니다. 나중에 코드에서 이러한 객체를 사용하려면 메모리에서 직접 가져 오면됩니다. 실행 효율성이 더 높습니다. 그러나 그것은 메모리를 차지합니다.
이 클래스에는 구성 파일을 읽기위한 두 가지 구현 클래스가 있습니다.

  • ClassPathXmlApplicationContext : classpath>에서 데이터를 읽는 것을 의미합니다.
  • FileSystemXmlApplicationContext : 현재 파일 시스템에서 데이터를 읽는 것을 의미합니다.

2.
컨테이너 의 인스턴스 객체는 언제 생성 되었습니까? 컨테이너의 객체는 스프링 컨테이너가 생성 될 때 이미 생성되었습니다.

3. Spring 컨테이너를 사용하여 객체를 생성하는 개략도
여기에 사진 설명 삽입

4. 스프링 컨테이너는 객체를 얻는 방법을 정의 할뿐만 아니라 스프링 컨테이너의 인스턴스 객체 수와 해당 객체 이름도 정의합니다.

//3.从容器中获取容器中定义的对象的数量
int num = context.getBeanDefinitionCount();

//4.获取容器中每个定义的对象的名称
String[] names = context.getBeanDefinitionNames();

5. 스프링 컨테이너는 Date와 같은 사용자 정의되지 않은 클래스도 얻을 수 있습니다.

구성 파일에 정의 됨

<bean id="myDate" class="java.util.Date"/>

테스트 방법 정의

@Test
public void testSomeServiceFour(){
    
    
    //1.指定spring的配置文件
    String config = "bean.xml";
    //2.创建spring容器中的所有对象
    ApplicationContext context = new ClassPathXmlApplicationContext(config);
    //3.从容器中获取某个对象
    Date myDate = (Date) context.getBean("myDate");
    System.out.println(myDate);
}

단점이 있으면 수정 해주세요!

추천

출처blog.csdn.net/hcz666/article/details/113190638