-
Spring Boot的核心注解是哪些?他由哪几个注解组成的?
@Target``(ElementType.TYPE) ``// 注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明 @Retention``(RetentionPolicy.RUNTIME) ``// 注解的生命周期,保留到class文件中(三个生命周期) @Documented` `// 表明这个注解应该被javadoc记录 @Inherited` `// 子类可以继承该注解 @SpringBootConfiguration` `// 继承了Configuration,表示当前是注解类 @EnableAutoConfiguration` `// 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助 @ComponentScan``(excludeFilters = { ``// 扫描路径设置 @Filter``(type = FilterType.CUSTOM, classes = TypeExcludeFilter.``class``), @Filter``(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.``class``) }) public` `@interface` `SpringBootApplication { ... }
@SpringBootApplication主要由3个组成,分别是SpringBootConfignation、EnableAutoConfiguration、ComponentScan
参考-【精品】深入SpringBoot注解原理及使用
参考-【精品】springboot启动流程
-
Spring Boot常用注解
@Controller & @RestController
Controller跳转的页面路径,spring 不支持jsp,可以借助thymeleaf模板渲染来实现;
RestController=Controller+ResponseBody,返回是字符串了。
Scope
-
使用注解: @Scope
-
效果:指定Bean的作用域 ,默认的是singleton,常用的还有prototype
Scope的全部可选项
- singleton 全局只有一个实例,即单例模式
- prototype 每次注入Bean都是一个新的实例
- request 每次HTTP请求都会产生新的Bean
- session 每次HTTP请求都会产生新的Bean,该Bean在仅在当前session内有效
- global session 每次HTTP请求都会产生新的Bean,该Bean在 当前global Session(基于portlet的web应用中)内有效
@Configuration
@Bean
@Autowired
Autowired实现原理
-
其实非常简单,autowired是一个注解,注解核心技术就是反射。
a.可以理解注解就是一个标记,利用反射机制获取一个类的Class对象;
b.通过这个class对象可以去获取他的每个方法Method,每一个Filed,等等
c.拿到这个注解之后可以判断是否我们自己的注解,如果是去实现我们想要的逻辑,对于autowired其实是字段,
最终调的filed.set值,如果是方法的就method.invoke执行目标方法。
说到注解,可以提一下JSR(Java Specification Resquests java规范提案,已经成为java的一个重要标准),Spring也是遵循JSR规范的。举一个例子,@Resource注解就是JSR-250定义的。
Autowired VS Resource
1):相同点 @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。 (2):不同点 a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。 b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入; c:属性 @Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。 还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合 @Qualifier注解进行限定,指定注入的bean名称。 @Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
d:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualifier进行限定。 blog.csdn.net/u010648555/…
-
bean注入4种方式
给容器中注册组件; 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类] 2)、@Bean[导入的第三方包里面的组件] 3)、@Import[快速给容器中导入一个组件] 1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名 2)、ImportSelector:返回需要导入的组件的全类名数组; 3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中 4)、使用Spring提供的 FactoryBean(工厂Bean); 1)、默认获取到的是工厂bean调用getObject创建的对象 2)、要获取工厂Bean本身,我们需要给id前面加一个&,&userFactoryBean 原文链接:blog.csdn.net/21aspnet/ar…
-
构建一个spring-boot-starter
关键点 EnableAutoConfiguration + spring.factories配置自动装配的类
-
送命题 Spring 、spring-mvc-和 SpringBoot 、Spring cloud 有什么不同?
Spring 提供了ioc依赖注入和AOP面向切面编程
spring-mvc是Spring的一个模块,用来方便开发we'b应用
springboot是一个自动配置依赖的框架,解决了依赖配置复杂的问题,开箱即用。
spring cloud是微服务框架,依赖spring boot。