@SpringBootApplication
在一個springboot應用程序的入口,用到的@SpringbootApplication注解的源碼如下:
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "exclude"
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "excludeName"
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
}
@SpringBootConfiguration的源碼
package org.springframework.boot;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Configuration;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
從上面兩段源碼可知,@SpringBootApplication
是@Configuration
悉稠,EnableAutoConfiguration
康吵,@ComponentScan
的組合究孕。
換言之 SpringBoot 提供了統(tǒng)一的注解來替代以上三個注解栈源,簡化程序的配置逊抡。
@Configuration
Srping官方文檔:
@Configuration is a class-level annotation indicating that an object is a source of bean definitions.
@Configuration classes declare beans via public @Bean annotated methods. Calls to @Bean methods on @Configuration classes can also be used to define inter-bean dependencies.
@Configuration 是一個類級注釋伦意,指示對象是一個bean定義的源火窒。@Configuration 類通過 @bean 注解的公共方法聲明bean。
@Bean 注釋是用來表示一個方法實例化驮肉,配置和初始化是由 Spring IoC 容器管理的一個新的對象熏矿。
通俗的講 @Configuration 一般與 @Bean 注解配合使用,用 @Configuration 注解類等價與 XML 中配置 beans缆八,用 @Bean 注解方法等價于 XML 中配置 bean曲掰。
舉個栗子:
xml配置
<beans>
<bean id = "UserService" class="com.user.Userservice">
<property name="userDAO" ref = "userDAO"></property>
</bean>
<bean id = "userDAO" class="com.user.UserDAO"></bean>
</beans>
java代碼:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
@Bean
public UserService getUserService(){
UserService userService = new UserService();
userService.setUserDAO(null);
return userService;
}
@Bean
public UserDAO getUserDAO(){
return new UserDAO();
}
}
package org.spring.com.user;
public class UserService {
private UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
package org.spring.com.user;
public class UserDAO {
}
小結(jié):
使用 public 修飾 @Bean 注解的方法;UserService奈辰、UserDAO 類無需聲明為 @Component栏妖、@Service、@Repository奖恰、@Controller吊趾;
@EnableAutoConfiguration
spring官方文檔: