Spring - 설정 Bean
87827 단어 봄 관련
설정 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>
<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);
}
}
<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. 상속
<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. 의지
1.4 Bean 의 역할 영역
scope: singleton (기본 값), prototype, session, request.
(3) request: 모든 네트워크 에 인 스 턴 스 를 만 들 기 를 요청 합 니 다. 요청 이 완료 되면 bean 은 효력 을 잃 고 쓰레기 회수 기 에 의 해 회 수 됩 니 다.
(4) session: request 범위 와 유사 하여 모든 session 에 bean 의 인 스 턴 스 가 있 는 지 확인 하고 session 이 만 료 되면 bean 은 효력 을 잃 습 니 다.
1.5 빈 주입 방식
<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>
<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 입 니 다.
구현 기능:
<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-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>
2.4 자동 조립 설명:
context: component - can 요 소 는 AutowiredAnnotationBeanPostProcessor 인 스 턴 스 를 자동 으로 등록 합 니 다. 이 인 스 턴 스 는 * * @ Autowired 와 @ Resource * *, @ Inject 주해 의 속성 을 자동 으로 조립 할 수 있 습 니 다. 세 개의 주해 용법 이 비슷 합 니 다.
@Autowired
@Autowired(required=false)
private UserService userService;
@Autowired(required=false)
@Qualifier("userService")
private UserService userService;
//
public void setUserService(@Qualifier("userService") UserService userService){
System.out.println(111111);
}
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;
}