一、主程序入口类
1、Application.class
@SpringBootApplication
public class SpringbootExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootExampleApplication.class, args);
}
}
2、特点
- 该类使用了@SpringBootApplication注解
- SpringApplication.run方法XxxApplication.class作为参数传入
注意: 必须是一个使用@SpringBootApplication注解类 当你注释掉该类的时候直接报错
二、@SpringBootApplication注解
1、作用
@SpringBootApplication注解是Spring Boot的核心注解,它是一个组合注解,它的主要作用是标注在某个类上,表示这是一个Spring Boot的配置类
等价于@SpringBootApplication
= (默认属性)@Configuration
+ @EnableAutoConfiguration
+ @ComponentScan
。
2、源码
@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)
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}
3、属性
属性 | 说明 |
---|---|
Class<?>[] exclude() | 排除特定的自动配置类 |
String[] excludeName() | 同exclude通过类名 |
String[] scanBasePackages() | 指定扫描指定包带注释的组件 |
Class<?>[] scanBasePackageClasses() | 将扫描指定类的包 |
4、注解说明
- 声明了@ComponentScan,scanBasePackages和scanBasePackageClasses两个属性上面同样声明了@AliasFor注解,分别指向了@ComponentScan注解的basePackages注解属性和basePackageClasses属性。
- 声明了@EnableAutoConfiguration注解,表明声明了类本身会默认开启自动配置
- 声明了@SpringBootConfiguration注解,继承了Configuration,表示当前是注解类也是配置类
三、@Configuration
1、说明
SpringBoot社区推荐使用基于JavaConfig的配置形式 ,@Configuration表示一个IoC容器的配置类,
2、源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
// 通过 别名注解指向@Component
@AliasFor(annotation = Component.class)
String value() default "";
boolean proxyBeanMethods() default true;
}
3、配置方式的区别
表达形式
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">
</beans>
JavaConfig方式
@Configuration
public class DruidConfiguration{
}
注册Bean
xml形式注册
<bean id="dataSource"
class="com.alibaba.druid.pool.DruidDataSource" />
JavaConfig方式
@Configuration
public class DruidConfiguration{
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
依赖注入
xml形式注册
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" />
<property name="cacheManager" ref="cacheManager" />
</bean>
<bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />
JavaConfig方式
@Configuration
public class ShiroConfiguration {
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setCacheManager(cacheManager);
return securityManager;
}
@Bean
public RedisCacheManager cacheManager(CustomRedisManager redisManager) {
RedisCacheManager redisCacheManager = new RedisCacheManager();
redisCacheManager.setRedisManager(redisManager);
return redisCacheManager;
}
}
总结
-
@Configuration
一定要配合@Bean
。用来替换xml配置文件。 -
@Bean
注解告诉Spring,带有@Bean的注解方法将返回一个对象
四、@ComponentScan
作用
自动扫描并加载符合条件的组件。我们可以通过basePackages等属性来细粒度的定制@ComponentScan
自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan
所在修饰类的package进行扫描
五、补充
1、@AliasFor
1.1、作用
别名注解,它可以注解到自定义注解的属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。
主要有两个作用:
- 在同一个注解使用别名注解,需要注意的是使用别名注解修饰的属性的类型必须相同,不能同时设置,必须设置默认值
- 覆盖自定义注解上的元注解中的属性
1.2、源代码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AliasFor {
@AliasFor("attribute")
String value() default "";
@AliasFor("value")
String attribute() default "";
Class<? extends Annotation> annotation() default Annotation.class;
}
1.3、栗子
修饰的元注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
2、@Repeatable
作用
重复注解类 表示标记的注解可以多次应用于相同的声明或类型,此注解由Java SE 8版本引入。
栗子
声明一个重复注解类
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
String[] value() default {};
}
声明一个容器注解类
public @interface ComponentScans {
ComponentScan[] value();
}
使用
@ComponentScan({"com.zw.mapper"})
@ComponentScan({"com.zw.service"})
public class RepetableApplication{
}
网友评论