首页>>后端>>SpringBoot->springboot注解注入bean(springbootapplication 注解)

springboot注解注入bean(springbootapplication 注解)

时间:2023-12-01 本站 点击:0

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。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/6100.html