springboot 开发中将 bean 放入容器 你知道的有几种方式?
spring 已然成为了java开发中的事实标准。
那么 springboot 开发中,你知道的几种 bean 置入容器中的方式呢?下面 让我们一起来 探索 :
1、[@Configuration + @Bean]
@Configuration用来声明一个配置类,然后使用 @Bean 注解,用于声明一个bean,将其加入到Spring容器中。
2、@Import注解导入
该注解用的可能不是很多,但是非常重要,进行 spring 扩展的时候经常用到。经常搭配自定义注解使用,然后王容器中注入一个配置文件。
使用:
这里就可以直接使用了,而且已经实例化过的。
其他的方式 @Service @Component ...
就不说了
SpringBoot注解介绍
1、@ComponentScan:
新建SpringBoot项目时 会自动生成一个入口类 命名规则是项目名+Application 该类上面有个@SpringBootApplication 项目启动时系统会自动扫描这个类的同级以及下级目录 将需要的对象注入到IOC容器 在需要时通过DI(依赖注入)注入到需要的对象中 那么问题来了 程序是怎么确定需要扫描哪些包呢 这是因为在@SpringBootApplication中有个注解 如图:
通过该注解上的配置 才能准确定位需要扫描哪些包 。
由此我们可以进行延伸 如果我们需要臊面的资源不再该类的同级或者下级 我们只需要在项目入口类上配置上@ComponentScan("资源路径")
就可以将我们需要的外部(其他路径)资源加载到IOC容器中了
2、@Qualifier("byname") 通过name名 注入
3、@Primary 对于同一个类型下有多个实现 该注解可以标明哪个实现类是优先被注入的 如图:
此时会优先注入带有@Primary注解的bean 如下图:
4、@ConditionalOnProperty 该注解可以读取配置文件 根据配置文件的值来决定是否将bean注入到容器中
该注解中的三个参数:value 值为配置文件中配置项的名字 havingValue为值 matchIfMissing 的值为true和false 时针对没有配置项的情况下时是否注入
5、
@Getter lombok为实体类自动生成getter方法
@Setter lombok为实体类自动生成setter方法
@AllArgsConstructor lombok为实体类自动生成全参数构造方法
@NoArgsConstructor lombok为实体类自动生成无参数构造方法
@RequiredArgsConstructor lombok为实体类自动生成成员变量非空的参数构造方法
@NonNull lombok为实体类指定参数非空
实体类.builder().name("muse").age(18).build()可以替换之前的setter方法赋值 不过需要在实体类上增加@Builder注解
但是一旦使用@Builder 就无法通过构造方法去实例化bean 因为@Builder会生成一个私有的构造方法 如果想使用构造方法实例化 可以配合使用NoArgsConstructor 或者手动新增一个无参构造
SpringBoot Filter中注入Bean
由于web应用启动的顺序顺序的原因(listener-filter-servlet),在Filter中注入Bean是不会成功的。
网上由很多的实现方式来实现在Filter中注入Bean,这里,我换一种方式,给Filter添加一个构造方法,在初始化Filter的时候把Bean实例传入,这里以Shiro中的拦截remmeberMe的Filter为例:
然后,在 Shiro 的配置文件中初始化 AddPrincipalToSessionFilter :
最后帮朋友打个小广告
一个有趣的迷你小程序
springboot 启动排除某些bean 的注入
问题:
最近做项目的时候,需要引入其他的jar。然后还需要扫描这些jar里的某些bean。于是使用注解:@ComponentScan
这个注解直接指定包名就可以,它会去扫描这个包下所有的class,然后判断是否解析:
@ComponentScan(basePackages = {"your.pkg", "other.pkg"})
public class Application {
}
其他的jar中定义了 redissonConfig 这个bean。然后我自己的项目也定义了redissonConfig 这个bean。导致项目启动报错。所以使用如下方式,排除jar 中的RedissonConfig.class。
@ComponentScan(basePackages = {"com.xx.xx.*"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {RedissonConfig.class}))
@ComponentScan注解。扫描或解析的bean只能是Spring内部所定义的,比如@Component、@Service、@Controller或@Repository。如果有一些自定义的注解,比如@Consumer、这个注解修饰的类是不会被扫描到的。这个时候我们就得自定义扫描器完成这个操作。
配置文件中使用的:component-scan标签底层使用ClassPathBeanDefinitionScanner这个类完成扫描工作的。@ComponentScan注解配合@Configuration注解使用,底层使用ComponentScanAnnotationParser解析器完成解析工作。
Springboot(四):springboot的注解有哪些注解
springboot的优点就是简化配置,,没有了xml,基本都是一个配置(application.properties)+注解来实现springboot的构建
那么都有哪些注解咧?说一下我在工作中常用的注解
1:##@SpringBootApplication
标识该类为SpringBoot项目启动类。并且让SpringBoot自动给程序进行必要的配置,等同于@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解.
(1):@SpringBootConfiguration表示的是该类会作为Springboot的一个配置类,
(2):@EnableAutoConfiguration表示开启自动配置功能,里面也实现了自动配置原理
@Configuration会把组件会装配到实体类上封装为一个bean,AutoConfigurationImportSelector的selectImports()这个方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。bean有了,配置有了,相当于对象也有了,这就是自动配置.
(3):@ComponentScan用来将包加入SpringIOC的包扫描,
2: @RestController 和@Controller
@RestController相当于@Controller+@ResponseBody,
@RestController加在类上面的注解,使得类里面的每个方法都将json/xml返回数据加返回到前台页面中。
比如return "abc" 前端会展示abc三个字母
@Controller加在类上面的注解,使得类里面的每个方法都返回一个视图页面。
比如return "abc" 前端会展示静态资源中的的abc.html里面的内容
3: @component和@configuration
虽然Component注解也会当做配置类,但是并不会为其生成CGLIB代理Class,所以在生成Driver对象时和生成Car对象时调用car()方法执行了两次new操作,所以是不同的对象。当时Configuration注解时,生成当前对象的子类Class,并对方法拦截,第二次调用car()方法时直接从BeanFactory之中获取对象,所以得到的是同一个对象。
4: @Autowired 与@Resource
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。