0
点赞
收藏
分享

微信扫一扫

SpringBoot注解说明超详细


1:@RestController

@RestController注解相当于@ResponseBody + @Controller合在一起的作用

@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面

若返回json等内容到页面,则需要加@ResponseBody注解

区别:

1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容

2) 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

@RequestMapping 来映射URL 到控制器类,或者是到Controller 控制器的处理方法上。当@RequestMapping 标记在Controller 类上的时候,里面使用@RequestMapping 标记的方法的请求地址都是相对于类上的@RequestMapping 而言的;当Controller 类上没有标记@RequestMapping 注解时,方法上的@RequestMapping 都是绝对路径。这种绝对路径和相对路径所组合成的最终路径都是相对于根路径“/ ”而言的。

2:@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求

的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面分成三类进行说明。

1、value,method;

value:指定请求的实际地址,指定的地址可以是URITemplate 模式(后面将会说明);

method:指定请求的method类型,GET、POST、PUT、DELETE等;

2、consumes,produces;

Consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;

produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指

定类型才返回;

3、params,headers;

Params:指定request中必须包含某些参数值是,才让该方法处理。

headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

3:springBoot启动类相关注解说明

@SpringBootApplication开启了Spring的组件扫描和Spring Boot的自动配置功能

 

@Configuration:标明该类使用Spring基于Java的配置

@ComponentScan:启用组件扫描,这样写的Web控制器类和其他组件才能被 自动发现并注册为Spring应用程序上下文里的Bean

Spring MVC 控制器,使用@Controller进行注解,这样组件扫描才能找到它

@EnableAutoConfiguration :这个不起眼的小注解也可以称为 @Abracadabra①,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写很多的配置

@SpringBootApplication注解包含了一下三个注解的组合,即:

@SpringBootApplication=@Configuration+@ComponentScan+@EnableAutoConfiguration

Spring Boot 1.2.0开始,有@SpringBootApplication就行了

 

@RunWith就是一个运行器

@RunWith(JUnit4.class)就是指用JUnit4来运行

@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境

@RunWith(Suite.class)的话就是一套测试集合,
@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件
单个文件 

@ContextConfiguration(Locations="classpath:applicationContext.xml")  
@ContextConfiguration(classes = SimpleConfiguration.class)
多个文件时,可用{}

@ContextConfiguration(locations = { "classpath:spring1.xml", "classpath:spring2.xml" }) 

@SpringBootTest注解进行单元测试

@SpringApplicationConfiguration注解从ReadingListApplication配置类里加载 Spring应用程序上

下文

@ContextConfiguration注解标识如何加载Spring的应用 程序上下文

 

注:

 Spring Boot起步依赖基本都以spring-boot-starter打头,随后是直接代表其功能的名字,比如web、test, 下文出现起步依赖的名字时,可能就直接用其前缀后的单词来表示

Spring Boot的Web起步依赖所引用的实际Jackson版本由你使用的Spring Boot版本决定

 

@Entity注解表明它是一个JPA实体,id属性加了@Id和@GeneratedValue注解,说明这个字段 是实体的唯一标识,并且这个字段的值是自动生成的

 

@ConditionalOnBean 配置了某个特定Bean

@ConditionalOnMissingBean 没有配置特定的Bean

@ConditionalOnClass Classpath里有指定的类

@ConditionalOnMissingClass Classpath里缺少指定的类

@ConditionalOnExpression 给定的Spring Expression Language(SpEL)表达式计算结果为true

@ConditionalOnJava Java的版本匹配特定值或者一个范围值

@ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext @ConditionalOnProperty 指定的配置属性要有一个明确的值

@ConditionalOnResource Classpath里有指定的资源

@ConditionalOnWebApplication 这是一个Web应用程序

@ConditionalOnNotWebApplication 这不是一个Web应用程序

 

4:声明Bean的注解:

@Component : 组件,没有明确的角色
@Service : 在业务逻辑层(service层)使用
@Repository : 在数据访问层(dao层)使用.
@Controller : 在展现层(MVC--SpringMVC)使用
 

注入Bean的注解:

@Aautowired : Spring提供的注解.
@Inject : JSR-330提供的注解
@Resource : JSR-250提供的注解
 

配置文件的注解:

@Configuration : 声明当前类是个配置类,相当于一个Spring配置的xml文件.
@ComponentScan (cn.test.demo): 自动扫描包名下所有使用 @Component @Service  @Repository @Controller 的类,并注册为Bean
@WiselyConfiguration : 组合注解 可以替代 @Configuration和@ComponentScan
@Bean : 注解在方法上,声明当前方法的返回值为一个Bean.
@Bean(initMethod="aa",destroyMethod="bb")--> 指定 aa和bb方法在构造之后.Bean销毁之前执行.
 

AOP切面编程注解:

@Aspect : 声明这是一个切面 
@After @Before. @Around 定义切面,可以直接将拦截规则(切入点 PointCut)作为参数
@PointCut : 专门定义拦截规则 然后在 @After @Before. @Around 中调用
@Transcational : 事务处理
@Cacheable : 数据缓存
@EnableAaspectJAutoProxy : 开启Spring 对 这个切面(Aspect )的支持
@Target (ElementType.TYPE):元注解,用来指定注解修饰类的那个成员 -->指定拦截规则
@Retention(RetentionPolicy.RUNTIME) 
--->当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.-->指定拦截规则
 

5:Spring 常用配置:

@import :导入配置类
@Scope : 新建Bean的实例 @Scope("prototype") 声明Scope 为 Prototype
@Value : 属性注入
@Value ("我爱你")  --> 普通字符串注入
@Value ("#{systemProperties['os.name']}") -->注入操作系统属性
@Value ("#{ T (java.lang.Math).random()  * 100.0 }") --> 注入表达式结果
@Value ("#{demoService.another}") --> 注入其他Bean属性
@Value ( "classpath:com/wisely/highlight_spring4/ch2/el/test.txt" ) --> 注入文件资源
@Value ("http://www.baidu.com")-->注入网址资源
@Value ("${book.name}" ) --> 注入配置文件  注意: 使用的是$ 而不是 #
@PostConstruct : 在构造函数执行完之后执行
@PreDestroy  : 在 Bean 销毁之前执行
@ActiveProfiles : 用来声明活动的 profile
@profile: 为不同环境下使用不同的配置提供了支持
 @Profile("dev") .......对方法名为 dev-xxxx的方法提供实例化Bean
@EnableAsync : 开启异步任务的支持(多线程)
@Asyns : 声明这是一个异步任务,可以在类级别 和方法级别声明.
@EnableScheduling : 开启对计划任务的支持(定时器)
@Scheduled : 声明这是一个计划任务 支持多种计划任务,包含 cron. fixDelay fixRate
@Scheduled (dixedDelay = 5000) 通过注解 定时更新
@Conditional : 条件注解,根据满足某一特定条件创建一个特定的Bean
@ContextConfiguration : 加载配置文件
@ContextConfiguration(classes = {TestConfig.class})
@ContextConfiguration用来加载ApplicationContext 
classes属性用来加载配置类
@WebAppCofiguration : 指定加载 ApplicationContext是一个WebApplicationContext
@Enable*注解:

@EnableAsync : 开启异步任务的支持(多线程)
@EnableScheduling : 开启对计划任务的支持(定时器)
@EnableWebMVC : 开启对Web MVC 的配置支持
@EnableAaspectJAutoProxy : 开启Spring 对 这个切面(Aspect )的支持
@EnableConfigurationProperties 开启对@ConfigurationProperties注解配置Bean的支持
@EnableJpaRepositories : 开启对Spring Data JAP Repository 的支持
@EnableTransactionManagement 开启对注解式事物的支持
@EnableCaching开启注解是缓存的支持.
@EnableDiscoveryClient 让服务发现服务器,使用服务器.Spring cloud 实现服务发现
@EnableEurekaServer 注册服务器 spring cloud 实现服务注册@
@EnableScheduling 让spring可以进行任务调度,功能类似于spring.xml文件中的命名空间<task:*>
@EnableCaching 开启Cache缓存支持;
SpringMVC 常用注解:

@Controller : 注解在类上 声明这个类是springmvc里的Controller,将其声明为一个spring的Bean.
@RequestMapping :可以注解在类上和方法上 映射WEB请求(访问路径和参数)
@RequestMapping(value= "/convert",produces+{"application/x-wisely"}) 设置访问URL 返回值类型
@ResponseBody : 支持将返回值放入response体内 而不是返回一个页面(返回的是一个组数据)
@RequestBody : 允许request的参数在request体中,而不是直接连接在地址后面 次注解放置在参数前
@Path Variable : 用来接收路径参数 如/test/001,001为参数,次注解放置在参数前
@RestController : @Controller + @ResponseBody 组合注解
@ControllerAdvice : 通过@ControllerAdvice可以将对已控制器的全局配置放置在同一个位置
@ExceptionHandler : 用于全局处理控制器的异常
@ExceptionHandier(value=Exception.class) -->通过value属性可过滤拦截器条件,拦截所有的异常
@InitBinder : 用来设置WebDataBinder , WebDataBinder用来自动绑定前台请求参数到Model中.
@ModelAttrbuute : 绑定键值对到Model中,
@RunWith : 运行器 
@RunWith(JUnit4.class)就是指用JUnit4来运行
@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
@RunWith(Suite.class)的话就是一套测试集合,
@WebAppConfiguration("src/main/resources") : 注解在类上,用来声明加载的ApplicationContex 是一个WebApplicationContext ,它的属性指定的是Web资源的位置,默认为 src/main/webapp ,自定义修改为 resource

@Before : 在 xxx 前初始化

 

6:Spring Boot 注解:

 @SpringBootApplication : 是Spring Boot 项目的核心注解 主要目的是开启自动配置
@SpringBootApplication注解是一个组合注解,主要组合了@Configuration .+@EnableAutoConfiguration.+@ComponentScan
@Value : 属性注入,读取properties或者 Yml 文件中的属性
@ConfigurationProperties : 将properties属性和一个Bean及其属性关联,从而实现类型安全的配置
@ConfigurationProperties(prefix = "author",locations = {"classpath:config/author.properties"})
通过@ConfigurationProperties加载配置,通过prefix属性指定配置前缀,通过location指定配置文件位置
@EnableAutoConfiguration 注解:作用在于让 Spring Boot   根据应用所声明的依赖来对 Spring 框架进行自动配置
        这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。
@ Configuration @EnableAutoConfiguration (exclude={xxxx.class}) 禁用特定的自动配置
@SpringBootApplication   注解等价于以默认属性使用 @Configuration,@EnableAutoConfiguration和     @ComponentScan。
 

 

@SuppressWarnings注解

@SuppressWarnings("unchecked")
告诉编译器忽略 unchecked 警告信息,如使用 list ArrayList等未进行参数化产生的警告信息
@SuppressWarnings("serial")
如 果编译器出现这样的警告信息: The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long     使用这个注释将警告信息去掉。
@SuppressWarnings("deprecation")
如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。使用这个注释将警告信息去掉。
@SuppressWarnings("unchecked", "deprecation")
告诉编译器同时忽略unchecked和deprecation的警告信息。
@SuppressWarnings(value={"unchecked", "deprecation"})
等同于@SuppressWarnings("unchecked", "deprecation")

@Entity : 映射数据库实体类

@Table(name = "S_PRODUCEINFO" ) : 表名为 "S_PRODUCEINFO"

@Id : 声明主键ID

@Column(name = "app_name", unique = true, length = 50) :对应数据库字段,属性

@Enumerated(EnumType. STRING) : 采用枚举值类型和数据库字段进行交互 

@Temporal : 时间格式 映射数据库会得到规定时间格式的日期

       @Enumerted(EnumType.STRING)  HH:MM:SS 格式的日期

       @Enumerted(EnumType.DATE) 获取年月日  yyyy-MM-dd 

       @Enumerted(EnumType.TIME) 获取时分秒  HH:MM:SS

 

       @Autowired自动注入,@Resource、@PostConstruct以及@PreDestroy。
  @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

@Autowired 与@Resource的区别:

1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

2、 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

 

@Autowired()@Qualifier("baseDao")

privateBaseDao baseDao;

3、@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")

privateBaseDao baseDao;

推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。

spring @Qualifier注解

@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。如下:

①可能存在多个UserDao实例

@Autowired   
@Qualifier("userServiceImpl")   
public IUserService userService;   
或者

@Autowired   
 public void setUserDao(@Qualifier("userDao") UserDao userDao) {   
     this.userDao = userDao;   
 }


 

这样Spring会找到id为userServiceImpl和userDao的bean进行装配。

 

②可能不存在UserDao实例

 

@Autowired(required = false)   
public IUserService userService  
 

个人总结:

@Autowired//默认按type注入
@Qualifier("cusInfoService")//一般作为@Autowired()的修饰用
@Resource(name="cusInfoService")//默认按name注入,可以通过name和type属性进行选择性注入

 

一般@Autowired和@Qualifier一起用,@Resource单独用。

当然没有冲突的话@Autowired也可以单独用

 

 

-----------常用注解--------

 

--定义Bean的注解

 

@Controller

@Controller("Bean的名称")

定义控制层Bean,如Action

 

@Service          

@Service("Bean的名称")

定义业务层Bean

 

@Repository   

@Repository("Bean的名称")

定义DAO层Bean

 

@Component  

定义Bean, 不好归类时使用.

 

--自动装配Bean (选用一种注解就可以)

@Autowired  (Srping提供的)

默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上

 

@Autowired(required=true)  

一定要找到匹配的Bean,否则抛异常。 默认值就是true 

 

@Autowired

@Qualifier("bean的名字") 

按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。

 

@Resource   JSR-250提供的

默认按名称装配,当找不到名称匹配的bean再按类型装配.

可以写在成员属性上,或写在setter方法上

可以通过@Resource(name="beanName") 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.

@Resource(name="beanName")指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.

 

@Inject   是JSR-330提供的

按类型装配,功能比@Autowired少,没有使用的必要。

 

--定义Bean的作用域和生命过程

@Scope("prototype")

值有:singleton,prototype,session,request,session,globalSession

 

@PostConstruct 

相当于init-method,使用在方法上,当Bean初始化时执行。

 

@PreDestroy 

相当于destory-method,使用在方法上,当Bean销毁时执行。

--声明式事务

@Transactional  

@Autowired @Resource @Qualifier的区别

实用理解:@Autowired @Resource 二选其一,看中哪个就用哪个。

 

简单理解:

@Autowired 根据类型注入, 

@Resource 默认根据名字注入,其次按照类型搜索

@Autowired @Qualifie("userService") 两个结合起来可以根据名字和类型注入

 

复杂理解:

比如你有这么一个Bean

@Service(“UserService”)

public Class UserServiceImpl implements UserService{};

现在你想在UserController 里面使用这个UserServiceImpl 

public Class UserController {

@AutoWire   //当使用这个注入的时候上面的 UserServiceImpl 只需要这样写 @Service,这样就会自动找到UserService这个类型以及他的子类型。UserServiceImpl 实现了UserService,所以能够找到它。不过这样有一个缺点,就是当UserService实现类有两个以上的时候,这个时候会找哪一个呢,这就造成了冲突,所以要用@AutoWire注入的时候要确保UserService只有一个实现类。

@Resource 默认情况下是按照名称进行匹配,如果没有找到相同名称的Bean,则会按照类型进行匹配,首先,根据这个注解的匹配效果可以看出,它进行了两次匹配,也就是说,如果你在UserService这个类上面这样写注解,@Service,它会怎么找呢,首先是找相同名字的,如果没有找到,再找相同类型的,而这里的@Service没有写名字,这个时候就进行了两次搜索,显然,速度就下降了许多。UserServiceImpl 上面如果有@Service默认的名字 是这个userServiceImpl,注意看,就是把类名前面的大写变成小写,就是默认的Bean的名字了。 @Resource根据名字搜索是这样写@Resource("userService"),如果你写了这个名字叫userService,那么UserServiceImpl上面必须也是这个名字,不然还是会报错。

 

@Autowired @Qualifie("userService") 是直接按照名字进行搜索,也就是说,对于UserServiceImpl 上面@Service注解必须写名字,不写就会报错,而且名字必须是@Autowired @Qualifie("userService") 保持一致。如果@Service上面写了名字,而@Autowired @Qualifie() ,一样会报错。

private UserService userService;
 
}

实际的工作是根据实际情况来使用的,通常使用AutoWire和@Resource多一些,bean的名字不用写,而UserServiceImpl上面能会这样写 @Service("userService")。访问速度比较好,通常是考虑速度的话。这个时候@AutoWire没有@Resource好用,因为@Resource可以根据名字来搜索,是这样写的@Resource("userService")。这个@Autowired @Qualifie("userService") 也可以用名字啊,为什么不用呢,原因很简单,增加工作量。而如果你不用注解,用xml文件的时候,对于注入Bean的时候要求写一个Id,xml文件时候的id就相当于这里的名字。

通常情况一个Bean的注解写错了,会报下面这些错误,最为常见,

No bean named 'user' is defined,这个表示没有找到被命名为user的Bean,通俗的说,就是名字为user的类型,以及它的子类型,出现这个错误的原因就是注入时候的类型名字为user,而搜索的时候找不到,也就是说可能那个搜索的类型,并没有命令为user,解决办法就是找到这个类型,去命令为user,

 

下面这个错误也常见,

No qualifying bean of type [com.service.UserService] found for dependency:

这个错误的原因就是类型上面没有加@Service这个注入,不仅仅是@Service,如果是其他层也会出现这个错误,这里我是以Service为例子说明,如果是DAO层就是没有加@Repository,Controller层,则是没有加@Controller。

还有,如果你还是想再简单点,无论是DAO,Controller,Service三个层,都可以用这个注解,@Component,这个注解通用所有的Bean,这个时候你可能会说了,有通常的为什么用的人少呢,那是因为MVC这个分层的设计原则,用@Repository,@Service,@Controller,这个可以区别MVC原则中的DAO,Service,Controller。便于识别。

 

Spring框架中@Autowired标签时默认情况下使用

Java代码 

@Autowired  
  @Autowired


注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。

@Autowired 默认是按照byType进行注入的,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。

例子:

@Autowired
private ExamUserMapper examUserMapper;  - ExamUserMapper是一个接口

 

1. spring先找类型为ExamUserMapper的bean

2. 如果存在且唯一,则OK;

3. 如果不唯一,在结果集里,寻找name为examUserMapper的bean。因为bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了

 

@Autowired也可以手动指定按照byName方式注入,使用@Qualifier标签,例如:

@Autowired () @Qualifier ( "baseDao" )

  Spring 允许我们通过

Java代码 

@Qualifier  
 @Qualifier


注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常。 

  

Java代码 

@Qualifier("XXX")  
 @Qualifier("XXX")


中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。 

  @Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。 

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。 

  

Java代码 

@Resource  
 @Resource


的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。 

  @Resource装配顺序 
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常 
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常 
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配

 

@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件。先创建一个接口,然后创建两个实现该接口的类,通过条件注解去实现在容器中到底装载哪个实现类,即在spring容器中装载那个bean。

1、创建服务接口
在该示例接口中,创建一个人的接口,并创建一个服务方法,然后通过该接口分别实现一个男人和一个女人的实现类,通过注解去判断装载的bean。接口代码为:

package com.spring.conditional.annotation;
//一个服务接口
 public interface Person {
     void birth();
 }

2、接口实现类
下面分别实现一个男人和一个女人的实现类。

男人的实现方类:

package com.spring.conditional.annotation;
public class Man implements Person {
    @Override
     public void birth() {
         System.out.println("我不会生孩子……");
     }}

女人的实现类为:

package com.spring.conditional.annotation;
public class Woman implements Person {
    @Override
     public void birth() {
         System.out.println("我要生孩子了……");
     }}

3、创建Man和Woman的判断条件类
Man的条件类

package com.spring.conditional.annotation;
import org.springframework.context.annotation.Condition;
 import org.springframework.context.annotation.ConditionContext;
 import org.springframework.core.type.AnnotatedTypeMetadata;public class ManCondition implements Condition {
    @Override
     public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
         return false;
     }
 }

Woman的条件类

package com.spring.conditional.annotation;
import org.springframework.context.annotation.Condition;
 import org.springframework.context.annotation.ConditionContext;
 import org.springframework.core.type.AnnotatedTypeMetadata;public class WomanCondition implements Condition {
    @Override
     public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
         return true;
     }
 }

4、创建配置类

package com.spring.conditional.annotation;
import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Conditional;
 import org.springframework.context.annotation.Configuration;@Configuration
 @ComponentScan
 public class ConditionalConfig {    @Bean
     @Conditional(ManCondition.class)
     //如果ManCondition中的match方法返回结果true,就创建该Bean,否则不创建
     public Man getMan(){
         return new Man();
     }     @Bean
     @Conditional(WomanCondition.class)
     public Woman getWoman(){
         return new Woman();
     }
 }

5、创建测试方法

package com.spring.conditional.annotation;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestMain {
    public static void main(String[] args) {
         AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConditionalConfig.class);
         Person person = ctx.getBean(Person.class);
         //通过条件类判断,只有Woman的条件类返回true,所以在容器中只能找到Woman的实现类的装载bean,而Woman又是继承自Person的,所以,在容器中可以找到一个唯一的Bean,通过getBean获取到。
         System.out.println(person);
         person.birth();
     }}

输出结果为:

com.spring.conditional.annotation.Woman@75881071
我要生孩子了……

 

@EnableWebSecurity注解启用web权限认证; 

自定义一个类,在类上面加@EnableWebSecurity注解
有两种方式: 
一是直接在入口类中加上该注解,入口类不需要继承自WebSecurityConfigurerAdapter 
二是添加注解后再继承自WebSecurityConfigurerAdapter类; 继承自该类后,将会自动添加如表单登录、记住用户名密码等十来个个Filter 
这些Filter是在HttpSecurity中定义的; 而HttpSecurity又是在WebSecurityConfigurerAdapter中创建的使用的

@WebAppConfiguration注解声明,由SpringJUnit4ClassRunner创建的应用程序上下 文应该是一个WebApplicationContext(相对于基本的非WebApplicationContext)

@Before注解,表明它应该在测试方法之前执行

 

@WithMockUser:加载安全上下文,其中包含一个UserDetails,使用了给定的用户名、 密码和授权。

 @WithUserDetails:根据给定的用户名查找UserDetails对象,加载安全上下文

@WebIntegrationTest注解用在测试类上,声明Spring Boot为测试创建应用程序上下文,启动一个嵌入式的Servlet容器 

@Value注解是spring的,注入值

 例: @Value("${local.server.port}")

          private int port;

举报

相关推荐

0 条评论