Spring 상용 주해 해석
1.1 @Configuration
@Configuration
public class MainConfig {
}
@ Configuration 설명 에 따 르 면 이 종 류 는 설정 클래스 입 니 다. 이 종 류 는 Spring 응용 컨 텍스트 에 bean 을 만 드 는 방법 에 대한 세부 사항 을 포함 해 야 합 니 다.
1.2 @ComponentScan
@Configuration
@ComponentScan("per.ym")
public class MainConfig {
}
@ Componentscan 주 해 는 구성 요소 스 캔 을 사용 합 니 다. xml 에 설정 되 어 있 습 니 다.위 설정 은 per. ym 패키지 의 모든 종 류 를 스 캔 합 니 다. value 값 을 설정 하지 않 으 면 설정 류 가 있 는 가방 을 기본 패키지 (base package) 로 구성 요 소 를 스 캔 합 니 다.여러 가방 을 동시에 스 캔 하고 싶다 면 이렇게 설정 할 수 있 습 니 다.
@Configuration
@ComponentScan("per.ym, per.mm")
public class MainConfig {
}
위의 예 에서 설정 한 기본 패 키 지 는 String 형식 으로 표 시 됩 니 다.나 는 이것 이 가능 하 다 고 생각 하지만, 이런 방법 은 유형 이 안전 하지 않다 (not type - safe).코드 를 재 구성 하면 지정 한 기본 패키지 에 오류 가 발생 할 수 있 습 니 다.가방 을 간단 한 String 형식 으로 설정 하 는 것 외 에 @ Componentscan 은 가방 에 포 함 된 클래스 나 인터페이스 로 지정 하 는 또 다른 방법 을 제공 합 니 다.
@Configuration
@ComponentScan(basePackageClasses = {MyService.class, MyDao.class})
public class MainConfig {
}
가방 에 스 캔 을 위 한 빈 태그 인터페이스 (marker interface) 를 만 드 는 것 을 고려 할 수 있 습 니 다.인 터 페 이 스 를 표시 하 는 방식 을 통 해 재 구성 에 우호 적 인 인터페이스 인용 을 유지 할 수 있 지만 실제 응용 프로그램 코드 를 참조 하 는 것 은 피 할 수 있 습 니 다.
1.3 @Controller, @Service, @ Repository, @Component
이 몇 개 는 자 연 스 럽 게 말 할 필요 도 없 이 가장 많이 본 셈 이다. 잠 금 장식 류 는 spring 용기 에 스 캔 되면 spring 관리 에 들 어 갈 것 이다.
@ Controller 대응 표현 층 의 Bean
@ Service 에 대응 하 는 것 은 비 즈 니스 층 Bean 입 니 다.
@ Repository 대응 데이터 액세스 층 Bean
@ Component, 상기 3 중 을 명확 하 게 선택 하지 못 하면 이 걸 로 하 세 요.
Spring 응용 컨 텍스트 의 모든 bean 은 하나의 ID 를 지정 합 니 다. 명확 하 게 지정 되 지 않 으 면 Spring 은 클래스 이름 에 따라 하나의 ID 를 지정 합 니 다. 즉, 클래스 이름 의 첫 번 째 자 모 를 소문 자로 바 꾸 는 것 입 니 다.이렇게 표시 할 수 있 는 ID:
@Component("ymm")
public class Person() {
}
Spring 은 @ Named (Java 의존 주입 규범 에서 제공 하 는) 를 @ Component 주해 의 대체 방안 으로 지원 합 니 다.둘 사이 에는 약간의 차이 가 있 지만 대부분의 장면 에서 그들 은 서로 바 꿀 수 있다.
1.4 @Bean
@ Bean 주 해 는 Spring 에 게 이 방법 을 알려 줍 니 다. 이 대상 은 Spring 응용 컨 텍스트 의 bean 으로 등록 해 야 합 니 다.방법 체 에는 최종 적 으로 bean 인 스 턴 스 를 만 드 는 논리 가 포함 되 어 있다.
@Configuration
public class MainConifg {
@Bean
public BookDao bookDao(){
return new BookDao();
}
}
@ Bean 주 해 는 Spring 에 게 이 방법 을 알려 줍 니 다. 이 대상 은 Spring 응용 컨 텍스트 의 bean 으로 등록 해 야 합 니 다.방법 체 에는 최종 적 으로 bean 인 스 턴 스 를 만 드 는 논리 가 포함 되 어 있다.
기본적으로 bean 의 ID 는 @ Bean 주석 이 있 는 방법 명 과 같 습 니 다.상례 에서 비 안의 이름 은 북 다 오 가 될 것 이다.다른 이름 으로 설정 하고 싶다 면 이름 을 바 꿀 수도 있 고 name 속성 을 통 해 다른 이름 을 지정 할 수도 있 습 니 다.
@Configuration
public class MainConifg {
@Bean(" ymBookDao")
public BookDao bookDao(){
return new BookDao();
}
}
이렇게 초기 화 방법 과 소각 방법 을 설정 할 수 있 습 니 다.
@Configuration
public class MainConifg {
@Bean(initMethod = "init", destroyMethod = "destroy")
public BookDao bookDao(){
return new BookDao();
}
}
이것 은 xml 에 init - method = "init" destroy - method = "destory" 를 설정 하 는 것 과 같 습 니 다.
1.5 @Autowired
@ Autowired 주 해 를 통 해 spring 의 자동 조립 을 실현 할 수 있 습 니 다. 자동 조립 은 Spring 이 bean 의존 을 자동 으로 만족 시 키 는 방법 입 니 다. 의존 을 만족 시 키 는 과정 에서 Spring 응용 컨 텍스트 에서 특정한 bean 수요 에 맞 는 다른 bean 을 찾 습 니 다.
@Service
public class BookService {
@Autowired(required=false)
private BookDao bookDao;
}
속성, 구조 기, setter 방법 에 @ Autowired 를 표시 할 수 있 습 니 다.실제로 Setter 방법 은 특별한 점 이 없습니다. @ Autowired 주 해 는 클래스 의 어떤 방법 에 도 사용 할 수 있 습 니 다.
spring 은 자체 적 으로 @ Autowired 를 제외 하고 자바 규범 중의 @ Resource (JSR 250) 와 @ Inject (JSR 330) 를 지원 합 니 다. 이들 의 차 이 는 다음 과 같 습 니 다.
@Autowired:
a. 기본 값 은 용기 에서 해당 하 는 구성 요 소 를 찾 습 니 다. applicationContext. getBean (BookDao. class) 이 있 고 하나의 bean 만 의존 수요 에 맞 으 면 이 bean 은 조립 됩 니 다.같은 유형의 구성 요 소 를 여러 개 찾 으 면 속성 이름 을 구성 요소 의 id 로 용기 에서 applicationContext. getBean ("bookDao") 을 찾 습 니 다.
b, @ Qualifier ("bookDao"): 속성 명 대신 @ Qualifier 를 사용 하여 설치 할 구성 요소 의 id 를 명 확 히 지정 합 니 다.
c. 자동 조립 기본 값 은 반드시 속성 을 할당 해 야 합 니 다. 없 으 면 잘못 보고 합 니 다.@ Autowired (required = false) 를 사용 할 수 있 습 니 다.
d, @ Primary: Spring 을 자동 으로 조립 할 때 기본 값 으로 선 호 하 는 bean 을 사용 합 니 다.@ Qualifier 를 사용 하여 설치 할 bean 의 이름 을 지정 할 수도 있 습 니 다.
@Resource:
a. @ Autowired 와 마찬가지 로 자동 조립 기능 을 실현 합 니 다.기본 값 은 구성 요소 이름 에 따라 조립 합 니 다.
b. @ Primary 기능 은 지원 되 지 않 습 니 다.
c. required = false 기능 은 지원 되 지 않 습 니 다.
@Inject:
a. @ Autowired 와 마찬가지 로 자동 조립 기능 을 실현 합 니 다.
b. required = false 기능 은 지원 되 지 않 습 니 다.
가능 한 예:
@Configuration
@ComponentScan("per.ym.service")
public class MainConifgOfAutowired {
@Primary
@Bean("bookDao1")
public BookDao bookDao1(){
BookDao bookDao = new BookDao();
bookDao.setLable("1");
return bookDao;
}
@Bean("bookDao2")
public BookDao bookDao2(){
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
}
@Service
public class BookService {
@Qualifier("bookDao1")
@Autowired(required=false)
private BookDao bookDao;
//@Resource(name="bookDao2")
//private BookDao bookDao;
//@Qualifier("bookDao2")
//@Inject
//private BookDao bookDao;
}
public class BookDao {
private String lable = "0";
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
}
1.6 @Import
가 져 오 는 방식 으로 용기 에 구성 요 소 를 빠르게 가 져 옵 니 다. 그 위 에 일반 bean, ImportSelector, ImportBean Definition Registrar 등 3 가지 유형의 값 을 설정 할 수 있 습 니 다.특히 @ Configuration 주석 으로 수 정 된 bean 을 가 져 올 수 있 습 니 다. 이것 은 spring 프로필 에서 다른 프로필 을 가 져 올 때 와 비슷 합 니 다.
@Configuration
@Import({MainConfig2.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig {
}
MainConfig 2 는 다른 설정 클래스 나 일반적인 bean 일 수 있 습 니 다.
@Configuration
public class MainConfig2 {
@Bean
public Person person(){
return new Person();
}
}
ImportSelector, selectImports 방법 으로 되 돌아 오 는 배열 에는 용 기 를 가 져 올 bean 의 모든 클래스 이름 이 포함 되 어 있어 야 합 니 다.
public class MyImportSelector implements ImportSelector {
// ,
//AnnotationMetadata: @Import
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// null , NPE
return new String[]{"per.ym.bean.Car","per.ym.bean.Dog"};
}
}
ImportBeanDefinitionRegistrar, BeanDefinitionRegistry. registerBeanDefinition 수 동 등록 용기 에 추가 할 bean 을 호출 합 니 다.
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:
* BeanDefinitionRegistry:BeanDefinition ;
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// Bean
RootBeanDefinition beanDefinition = new RootBeanDefinition(Red.class);
// Bean, bean
registry.registerBeanDefinition("red", beanDefinition);
}
}
1.7 @Conditional
클래스 에 놓 으 면 조건 이 만족 할 때 이 클래스 에 설 정 된 모든 bean 등록 이 유효 합 니 다.
방법 에 놓 고 조건 을 만족 시 킬 때 만 용기 에 현재 bean 을 등록 합 니 다.
@Conditional({WindowsCondition.class})
@Configuration
public class MainConfig {
@Conditional(LinuxCondition.class)
@Bean("linus")
public Person person(){
return new Person("linus");
}
}
/**
* ConditionContext: ( )
* AnnotatedTypeMetadata:
*/
// windows
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//1、 ioc beanfactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//2、
ClassLoader classLoader = context.getClassLoader();
//3、 bean
BeanDefinitionRegistry registry = context.getRegistry();
//4、
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
if(property.contains("Windows")){
return true;
}
return false;
}
}
1.8 @Profile
현재 환경 에 따라 일련의 구성 요소 의 기능 을 동적 으로 활성화 하고 전환 합 니 다.구성 요소 가 어느 환경 에서 만 용기 에 등록 되 는 지 지정 합 니 다. 지정 하지 않 으 면 어떤 환경 에서 도 이 구성 요 소 를 등록 할 수 있 습 니 다.
환경 표 지 를 추가 한 bean 은 이 환경 이 활성화 되 었 을 때 만 용기 에 등록 할 수 있 습 니 다.
설정 클래스 에 쓰 여 있 습 니 다. 지정 한 환경 일 때 만 전체 설정 클래스 의 모든 설정 이 적 용 됩 니 다.
@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile implements EmbeddedValueResolverAware{
@Value("${db.user}")
private String user;
private StringValueResolver valueResolver;
private String driverClass;
@Profile("test")
@Bean("testDataSource")
public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Profile("dev")
@Bean("devDataSource")
public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Profile("prod")
@Bean("prodDataSource")
public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(pwd);
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/prod");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
this.valueResolver = resolver;
driverClass = valueResolver.resolveStringValue("${db.driverClass}");
}
}
db.properties:
db.user=root
db.password=123456
db.driverClass=com.mysql.jdbc.Driver
시작 명령 줄 에 환경 매개 변 수 를 설정 합 니 다:
-Dspring.profiles.active=test
코드 방식 설정:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
applicationContext.getEnvironment().setActiveProfiles("dev");
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[토비의 스프링] - 예외체크 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 한다. 콜백과 템플릿처럼 긴밀하게 역할을 분담하고 있는 관계가 아니라면 자신의 코드에서 발생하는 예외를 그냥 던져버리는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.