Spring - 설정 Bean

87827 단어 봄 관련
Spring
설정 bean
설정 형식: XML 파일 기반 방식, 주석 기반 방식, 자바 기반 설정
Bean 의 배치 방식: 모든 종류의 이름 (반사) 을 통 해 공장 방법, Factory Bean 을 통 해
IOC 용기: BeanFactory, ApplicationContext
Bean 의 주입 방식: 속성 set 주입, 구조 기 주입, 공장 방법 주입 (추천 하지 않 음)
1. XML 파일 기반 방식
 

<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-3.0.xsd
   http://www.springframework.org/schema/tx 
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context      
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
 
    <bean name="c" class="com.nchu.pojo.Category">
        <property name="name" value="category 1" />
    bean>
    
    <bean name="p" class="com.nchu.pojo.Student">
    	<property name="name" value="leihuihuanhg"/>
    	<property name="sid"  value="16206119"/>
    	<property name="category" ref="c"/>
    	<property name="son" ref="s"/>
    bean>
 	
    <bean name="s" class="com.nchu.pojo.Son">
        <property name="sid" value="1" />
    bean>
beans>

//	Java     
public static void main(String[] args) {
		
		//1.    Spring   IOC     
		//	ApplicationContext  IOC  
		//	ClassPathXmlApplicationContext: ApplicationContext       。               。
		//	
		ApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationContext.xml" });
		
		//2.   IOC      Bean   
		//	    bean id    IOC    bean
		Category c = (Category) context.getBean("c");
		//	        (   bean IOC        )
		Category c2 = (Category) context.getBean(Category.class);
		
		//3.   Category     
		System.out.println(c.getName());
		System.out.println(c2.getName());
	}
}

자동 조립:
by Type 과 ByName
[외부 체인 이미지 저장 에 실 패 했 습 니 다. 원본 사이트 에 도 난 방지 체인 메커니즘 이 있 을 수 있 습 니 다. 그림 을 저장 해서 직접 업로드 하 는 것 을 권장 합 니 다 (img - 8WcrgNab - 1570415559250) (C: \ Users \ Leisure \ AppData \ Roaming \ Typora \ \ typora - user - images \ 1569237296261. png)]
1.2 Bean 설정 방식:
  • 전 류 명 (반사)
  • 을 통 해
     
        <bean name="c" class="com.nchu.pojo.Category">
            <property name="name" value="category 1" />
        bean>
    
  • 공장 방법 (정태 공장 방법 & 실례 공장 방법) 2.1 정태 공장 방법:
    
    
    	
    	
    	
    		 
    		 <constructor-arg value="  "> constructor-arg>
    	bean>
    
    //	     :                  Bean  
    public class InstanceSonFactory {
    	private static Map<String,Son> sons = new HashMap<String,Son>();
    	
    	//           bean
    	static {
    		sons.put("  ",new Son(1," "));
    		sons.put("  ",new Son(2," "));
    	}
    	
    	//              
    	public static Son getSon(String name){
    		return sons.get(name);
    	}
    }
    
    2.2 실례 공장 방법:
    
    
    	bean>
    	
    	
    
    	<bean id="son1" factory-bean="son" factory-method="getSon">
    		
    		<constructor-arg value="  "> constructor-arg>
    	bean>
    
    //	     
    public class InstanceSonFactory {
    	private Map<String,Son> sons = null;
    	//      :         ,             bean   
        
    	//           bean
    	public InstanceSonFactory(){
    		sons = new HashMap<String,Son>();
    		sons.put("  ",new Son(1," "));
    		sons.put("  ",new Son(2," "));
    	}
    	
    	
    	public Son getSon(String name){
    		return sons.get(name);
    	}
    }
    
  • Factory Bean XML 파일:
    	
    
    	
    		 <property name="brand" value="  ">property>
    	bean>
    
    Java 파일:
    //     factoryBean     FactoryBean   
    public class SonFactoryBean implements FactoryBean{
    
    	private String brand;
    	
    	
    	//   getObject     bean  
    	@Override
    	public Son getObject() throws Exception {
    		// TODO Auto-generated method stub
    		return new Son(20," ");
    	}
    	//        
    	@Override
    	public Class getObjectType() {
    		// TODO Auto-generated method stub
    		return Son.class;
    	}
    	//        
    	@Override
    	public boolean isSingleton() {
    		// TODO Auto-generated method stub
    		return true;
    	}
    	public String getBrand() {
    		return brand;
    	}
    	public void setBrand(String brand) {
    		this.brand = brand;
    	}
    
    }
    
    
  • 1.3 빈 의 관계: 상속, 의존
    1. 상속
  • 서브 빈 은 부모 빈 에서 설정 을 계승 합 니 다. 빈 의 속성 설정 을 포함 하고 요소 의 모든 속성 이 계승 되 는 것 이 아 닙 니 다. 예 를 들 어 autowire, abstract 등 입 니 다.
  • 서브 빈 도 부모 빈 으로 부터 물 려 받 은 설정 을 덮어 쓸 수 있다.
  • 부모 Bean 은 설정 템 플 릿 으로 도 사용 할 수 있 고 Bean 인 스 턴 스 로 도 사용 할 수 있 습 니 다. 부모 Bean 만 템 플 릿 으로 하려 면 abstract 속성 을 true 로 설정 하면 Spring 은 이 Bean 을 예화 하지 않 습 니 다.
  • 부모 Bean 의 class 속성 을 무시 하고 하위 Bean 이 자신의 클래스 를 지정 하도록 하고 같은 속성 설정 을 공유 할 수 있 습 니 다. 그러나 이때 abstract 는 true 로 설정 해 야 합 니 다.
  • 	
    	<bean id="student1" parent="student">
    		<property name="name" value="hui">property>
    	bean>
    
    	
    	<bean id="student" abstract="true" class="com.nchu.pojo.Student">
    		<property name="name" value="lei">property>
    		<property name="age" value="20">property>
    		<property name="sid" value="16206119">property>
    		<property name="son"  ref="son">property>
    		<property name="category" ref="c">property>
    	bean> 
    
        <bean id="student" abstract="true">
        bean>
    

    2. 의지
  • Spring 은 사용자 가 depends - on 속성 을 통 해 Bean 의 사전 의존 Bean 을 설정 할 수 있 도록 합 니 다. 사전 의존 Bean 은 본 Bean 의 예화 전에 만 듭 니 다
  • 여러 Bean 에 사전 의존 하면 쉼표, 빈 칸 으로 Bean 의 이름
    
    	
    
  • 을 설정 할 수 있 습 니 다.
    1.4 Bean 의 역할 영역
    scope: singleton (기본 값), prototype, session, request.
    
    	
    

    (3) request: 모든 네트워크 에 인 스 턴 스 를 만 들 기 를 요청 합 니 다. 요청 이 완료 되면 bean 은 효력 을 잃 고 쓰레기 회수 기 에 의 해 회 수 됩 니 다.
    (4) session: request 범위 와 유사 하여 모든 session 에 bean 의 인 스 턴 스 가 있 는 지 확인 하고 session 이 만 료 되면 bean 은 효력 을 잃 습 니 다.
    1.5 빈 주입 방식
  • Set () 속성 주입
    
    <bean name="p" class="com.nchu.pojo.Student">
        	
        	<property name="name" value="leihuihuanhg"/>
        	<property name="sid"  value="16206119"/>
        
        	
        	<property name="category" ref="c"/>
    
        	
            <constructor-arg ref="s"/>
        	<property name="s.price" value="250"/>   
        
        	
        	<property name="c1">
        		<bean class="com.nchu.pojo.Category">
        			<constructor-arg value="lei" type="String">constructor-arg>
        			<constructor-arg value="16206119" index="1">constructor-arg>
        		bean>
    		property>
    bean>
    
     	
        <bean name="c" class="com.nchu.pojo.Category">
            <property name="name">
            
            	<list>
            		<ref bean="c1"/>
            	list>
            property>
            <property name="id">
            
            	<map>
            		<entry key="11" value="BB">entry>
            	map>
            property>
        bean>
    
    	
    	<bean id="c20" class="com.nchu.pojo.Category" p:name="lei20"/>
    
    bean>
    
  • 구조 기 주입
    
    <bean name="c1" class="com.nchu.pojo.Category">
            <constructor-arg value="lei" type="Java.lang.String">constructor-arg>
        
        	<constructor-arg  index="1">
        	<value>16206119value>
        constructor-arg>
        
        	<constructor-arg  index="2">
        	<value>]]>value>
        constructor-arg>
    bean>
    
  • 공장 방법 주입: 정태 공장 방법 주입, 실례 공장 방법 주입
  • 1.6 외부 속성 파일 사용
  • Spring 은 Property Placeholder Configurer 의 BeanFactory 백 엔 드 프로 세 서 를 제공 합 니 다. 이 프로 세 서 는 Bean 설정 의 일부 내용 을 속성 파일 로 옮 길 수 있 습 니 다. Bean 설정 파일 에서 ${var} 의 변 수 를 사용 할 수 있 습 니 다. Property Placeholder Configurer 는 속성 파일 에서 속성 을 불 러 오고 이 속성 을 사용 하여 변 수 를 교체 할 수 있 습 니 다.
  • Spring 은 속성 파일 에 ${propname} 을 사용 하여 속성 간 의 상호 인용 을 실현 할 수 있 습 니 다.
  • 	
    	
    	<context:property-placeholder location="classpath:db.properties"/>
    	
    	<bean id="dateSource" class="com.asjf2.DataSource"> 
    		<property name="user" value="${user}">property>
    		<property name="password" value="${password}">property>
    		<property name="driverClass" value="${driverUrl}">property>
    		<property name="jdbcUrl" value="${jdbcUrl}">property>
    	bean>
    
    //       "db.properties"
    user=root
    password=1234
    driverclass=com.mysql.jdbc.Driver
    jdbcurl=jdbc:mysql:///test
    

    1.7 SpEL
    Spring 표현 식 언어 * * (SpEL 로 약칭): 실행 시 검색 및 작업 대상 그림 * * 을 지원 하 는 강력 한 표현 식 언어 입 니 다.
    문법:
    \ # {...} 한정 문자 로 대괄호 안에 있 는 문 자 는 SpEL 입 니 다.
    구현 기능:
  • Bean 의 id 를 통 해 Bean 을 인용
  • 호출 방법 및 인용 대상 의 속성
  • 표현 식 의 값 을 계산 합 니 다
  • 정규 표현 식 일치
  • 예:
    
    <property name=“name” value="#{'Chuck'}"/>   
    <property name='name' value='#{"Chuck"}'/>
    
    
    <bean id="student" class="com.nchu.pojo.Student">
    		<property name="age" value="20">property>
    		
    		<property name="score" value="#{T(java.lang.Math).PI * 80}"/>
    		
    		<property name="son" value="#{son}">property>
    		
    		<property name="sid" value="#{son.sid}">property>
    		
    		<property name="name" value="#{son.sex == ' ' ? '  ' : '  '}">property>
    		<property name="category" ref="c">property>
    	bean> 
    

    2. 주해 에 기초 한 방식
    2.1 특정한 주해:
    @Component //     ,       Spring     
    @Respository 	//       
    @Service 		//     (   )  
    @Controller		//    (   )    
    
    //  :    ,      
    //                ,             ,               
    

    2.2 Spring 기본 이름 정책:
    //          ,          value           
    UserService =>> userService
    
    @Controller(value="uc")
         
    @Controller("uc")
    
    

    2.3 설정 단계:
  • 구성 요소 류 에 특정한 주 해 를 사용 합 니 다
  • 설정 파일 에 * * context: component - can * *
    
       
    
       <context:component-scan base-package="com.nchu" use-default-filters="true" resource-pattern="Service/*.class">
    		
    		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
       		
    		<context:exclude-filter type="assignable" expression="com.nchu.repository.UserRespository"/>
       		
       		
       		<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
       context:component-scan>
    
  • base - package 속성 은 스 캔 할 기본 패 키 지 를 지정 합 니 다. Spring 용 기 는 이 기본 패키지 와 하위 패키지 의 모든 종 류 를 스 캔 합 니 다. 여러 패 키 지 를 스 캔 해 야 할 때 * *, 쉼표 로 구분 할 수 있 습 니 다.
  • resource - pattern 속성 은 기본 패키지 의 모든 클래스 가 아 닌 특정한 클래스 만 스 캔 합 니 다. 예제:
  • [외부 체인 이미지 저장 에 실 패 했 습 니 다. 원본 사이트 에 도 난 방지 체인 메커니즘 이 있 을 수 있 습 니 다. 그림 을 저장 해서 직접 업로드 하 는 것 을 권장 합 니 다 (img - S4WDzXNj - 1570415559252) (C: \ Users \ Leisure \ AppData \ Roaming \ Typora \ \ typora - user - images \ 1569479016314. png)]
  • context: include - filter 서브 노드 는 포함 할 대상 클래스 를 표시 합 니 다 (* use - default - filters = "false" * * 와 결합 하여 사용 해 야 합 니 다)
  • context: exclude - filter 서브 노드 는 제외 할 목표 클래스
  • 를 표시 합 니 다.
  • context: component - scan 에서 몇 개의 context: include - filter 와 context: exclude - filter 서브 노드
  • 를 가 질 수 있 습 니 다.

    2.4 자동 조립 설명:
    context: component - can 요 소 는 AutowiredAnnotationBeanPostProcessor 인 스 턴 스 를 자동 으로 등록 합 니 다. 이 인 스 턴 스 는 * * @ Autowired 와 @ Resource * *, @ Inject 주해 의 속성 을 자동 으로 조립 할 수 있 습 니 다. 세 개의 주해 용법 이 비슷 합 니 다.
    @Autowired
  • 호 환 유형 을 가 진 단일 Bean 속성 자동 조립
  • 구조 기, 일반 필드 (비 Public), 모든 매개 변 수 를 가 진 방법 은 @ Authwired 주석
  • 을 사용 할 수 있 습 니 다.
  • 기본 적 인 상황 에서 @ Authwired 주 해 를 사용 하 는 모든 속성 을 설정 해 야 합 니 다. Spring 에서 일치 하 는 Bean 조립 속성 을 찾 지 못 하면 이상 이 발생 합 니 다. 특정한 속성 이 설정 되 지 않 으 면 @ Authwired 주해 의 required 속성 을 false
    	@Autowired(required=false)
    	private UserService userService;
    
  • 로 설정 할 수 있 습 니 다.
  • 기본 적 인 상황 에서 IOC 용기 에 여러 종류의 호 환 되 는 Bean 이 존재 할 경우, 유형의 자동 조립 을 통 해 작 동 할 수 없습니다. 이 때 @ Qualifier 주석 에서 Bean 의 이름 을 제공 할 수 있 습 니 다. Spring 은 방법 에 대한 참 조 를 허용 합 니 다 @ Qualifiter 는 Bean 을 주입 하 는 이름
    @Autowired(required=false)
    @Qualifier("userService")
    private UserService userService;
    
    //        
    public void setUserService(@Qualifier("userService") UserService userService){
    		System.out.println(111111);
    	}
    
  • 을 지정 하 였 습 니 다.
  • @ Authwired 주 해 는 배열 유형, 집합, java. util. Map 의 속성 에 도 적용 할 수 있 습 니 다.
  • 2.5 범 형 의존 주입
    Spring 4. x 에서 하위 클래스 에 대응 하 는 범 형 유형의 구성원 변 수 를 주입 할 수 있 고 범 형 기본 클래스 의 인용 관 계 는 클래스 계승 을 실현 할 수 있 습 니 다.
    * * 역할: * * 대량의 코드 를 절약 하고 개발 효율 을 높 일 수 있 습 니 다.
    [외부 체인 이미지 저장 에 실 패 했 습 니 다. 원본 사이트 에 도 난 방지 체인 메커니즘 이 있 을 수 있 습 니 다. 그림 을 저장 해서 직접 업로드 하 는 것 을 권장 합 니 다 (img - GlQAxWRA - 1570415559253) (C: \ Users \ Leisure \ AppData \ Roaming \ Typora \ \ typora - user - images \ 1569485691978. png)]
    //      
    public class BaseService<T> {
    	
    	@Autowired
    	protected BaseRespository<T> respository;
    	
    	public void add(){
    		System.out.println("add....");
    		System.out.println(respository);
    	}
    
    }
    
    //      
    public class BaseRespository<T> {
    
    }
    
    //       
    @Repository
    public class UserRepository extends BaseRespository<User> {
    
    }
    
    //       
    @Service
    public class UserService extends BaseService<User>{
    
    }
    

    확장:
    * * 동명 빈: * * 여러 개의 bean 은 같은 name 또는 id 를 가지 고 있 으 며 동명 빈 이 라 고 합 니 다.
    의 id 와 name 의 차이 점:
    id 와 name 은 모두 spring 용기 에서 bean 의 유일한 식별 자 입 니 다.
    id: bean 의 유일한 표지 입 니 다. 이름 형식 은 XML ID 속성의 이름 규범 에 부합 해 야 합 니 다.
    name: 특수 문 자 를 사용 할 수 있 으 며, 하나의 bean 은 여러 개의 이름 을 사용 할 수 있 습 니 다. name = "bean 1, bean 2, bean 3", 쉼표 나 분점 또는 빈 칸 으로 구분 할 수 있 습 니 다. id 가 없 으 면 name 의 첫 번 째 이름 은 기본적으로 id 입 니 다.
    spring 용 기 는 동명 의 bean 을 어떻게 처리 합 니까?
    같은 spring 설정 파일 에서 bean 의 id, name 은 중복 할 수 없습니다. 그렇지 않 으 면 spring 용기 가 시 작 될 때 오류 가 발생 할 수 있 습 니 다.
    하나의 spring 용기 가 여러 프로필 에서 설정 정 보 를 불 러 오 면 여러 프로필 에 같은 이름 의 bean 이 있 을 수 있 고, 뒤에 불 러 온 프로필 의 bean 정 의 는 앞 에 불 러 온 같은 이름 의 bean 을 덮어 씁 니 다.
    spring 용 기 는 id, name 속성 이 지정 되 지 않 은 bean 을 어떻게 처리 합 니까?
    하나의 탭 에 id, name 속성 이 지정 되 지 않 으 면, spring 용 기 는 클래스 전체 이름 의 기본 id 를 줍 니 다. id, name 속성 이 지정 되 지 않 은 탭 이 여러 개 있 으 면 spring 용 기 는 나타 나 는 순서에 따라 각각 id 값 을 '클래스 전체 이름 \ # 1', '클래스 전체 이름 \ # 2' 로 지정 합 니 다. L
    3. Spring 의 ContextApplication 사용
    Spring 은 다양한 유형의 응용 문맥 을 가지 고 있 습 니 다.
    1
    ⭐AnnotationConfigApplicationContext
    자바 기반 설정 클래스 에서 Spirng 응용 컨 텍스트 를 하나 이상 불 러 옵 니 다.
    2
    AnnotationConfigWebApplicationContext
    하나 이상 의 자바 기반 설정 클래스 에서 Spring Web 응용 컨 텍스트 를 불 러 옵 니 다.
    3
    ⭐ClassPathXmlApplicationContext
    클래스 경로 의 하나 이상 의 XML 프로필 에서 컨 텍스트 정 의 를 불 러 오고 컨 텍스트 의 정의 파일 을 자원 으로 사용 합 니 다.
    4
    ⭐FileSystemXmlApplicationContext
    파일 시스템 의 다음 XML 프로필 에서 상하 문 정 의 를 불 러 옵 니 다
    5
    XmlWebApplicationContext
    웹 에서 다음 XML 프로필 이나 여러 개 를 사용 하여 컨 텍스트 정 의 를 불 러 옵 니 다.
    3.1 자바 설정 에서 상하 문 불 러 오기 (. class 파일)
    //1. Java       , Bean        。
    ApplicationContext context=new AnnotationConfigApplicationContext(com.springaction.knights.config.KnightConfig.class);
    

    예시:
    public void launchByAnnotationConfigApplicationContext(){
         //   AnnotationConfigApplicationContext   Bean
         ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Bean_dog.class,BeanConfiguration.class);
         //    bean    
         Dog dog = applicationContext.getBean(Dog.class);
         Person person = applicationContext.getBean(Person.class);
         System.out.println(dog.getName());
         System.out.println(person);
         //         Bean(    )     
         String[] namesForType = applicationContext.getBeanNamesForType(Dog.class);
         for (String name : namesForType) {
            System.out.println(name);
        }
    }
    

    3.2 클래스 경로 에서 상하 문 불 러 오기 (xml 파일)
    //1.           , Bean        。
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    

    예시:
    public void launchByClassPathXmlApplicationContext(){
        //    ClassPathXmlApplicationContext   bean
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        //    bean    
        Person person = (Person)ac.getBean("person");
        System.out.println(person);
    
    }
    

    3.3 파일 시스템 에서 상하 문 불 러 오기 (xml 파일)
    //1.           , Bean        。
    ApplicationContext context=new FileSystemXmlApplicationContext("D:/applicationContext.xml");
    

    예시
    public void launchByFileSystemXmlApplicationContext(){
        //    ClassPathResource   bean
        ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\git-workspace\\ssm-in-action\\spring-in-action\\src\\main\\resources\\beans.xml");
        //    bean    
        Person person = (Person)ac.getBean("person");
        System.out.println(person);
    
    }
    

    ⭐ 3.4 BeanFactory 에서 불 러 오기 (xml 파일)
    //           
    BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
    

    예시
    public void launchByBeanFactory(){
        //    ClassPathResource       
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
        Dog bean = (Dog) beanFactory.getBean("dog");
        System.out.println(bean.getName()+bean.getAge());
    
    }
    

    상하 문 준비 가 완료 되면 상하 문 getBean () 방법 (beanFactory) 을 사용 하여 Spring 용기 에서 bean 을 가 져 올 수 있 습 니 다.
    3.5 @ Autowired 를 사용 하여 자동 조립
    	@Autowired
    	User user;
    

    * * @ Autowired * * 사용 시 * * @ Component * * 를 사용 하여 대응
    @Component
    public class User {
    
    	private Long id;
    
    	private String name;
    
    	private Integer age;
    }
    

    좋은 웹페이지 즐겨찾기