环境搭建
注解的方式是通过配置类的方式来注入组件,注解注入要比XML注入的方式简单,注解注入也需要在前者的基础上,添加一个spring-context的包,也是实际开发中常用的方式。
准备所需Jar包
Spring注解之组件注册
Spring提供了许多的注解配置,这样我们就可以通过注解的方式实现组件的注册,下图就是Spring中经常使用到的注解。
@ComponentScan和@Configurable
原先xml的方式
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
使用配置类
@Configurable来标注该类为Spring中的配置类,@ComponentScan(“model”)是为该配置类指定要去扫描的参数。
1 | kotlin复制代码package config; |
@Component
使用该注解就可以将Java对象@Component注册到Ioc容器中,@Component注解要是给属性赋值要配合@Value注解为属性赋值。
1 | kotlin复制代码/** |
配置类
1 | less复制代码/** |
使用@Configuration注入
1 | typescript复制代码@Component("students") |
测试
@Bean
使用@Bean注解该可以在我们的spring注册类里标注,创建对象的方法,可以通过一个返回值为该对象的方法去创建该对象,并通过构造器为该对象的属性进行赋值。
1 | typescript复制代码// 配置类 |
Java-Bean对象
1 | typescript复制代码public class Product { |
测试
@TypeFilter
@TypeFilter注解
是通过设置条件来过滤一些资源,我们可以过滤一些资源不让它加载到ioc容器中。它的使用要在@ComponentScan这个注解中国去使用,通过excludeFilters参数传值,excludeFilters是一个数组,可以设定多个@TypeFilter。
@TypeFilter语法
1 | less复制代码@Configurable |
@FilterType.CUSTOM自定义规则
使用自定义规则,我们必须给它创建一个制定规则的类,这个类要去实现TypeFilter这个接口,并实现match这个方法,过滤器就会根据match方法的返回值加载,如果去ture就去过滤不满足条件的,如果为false则不会去加载!
1 | java复制代码/** |
@Scope
Spring创建对象默认是单例的,使用@Scope来描述也就是scope=“singleton”,另外scope还有prototype、request、session、global session作用域。
各作用域的的作用
- singleton单例模式,全局有且仅有一个实例。(默认值)
- prototype原型模式,每次获取Bean的时候会有一个新的实例。
- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:
request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:
如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:
1
2
3
4
5
6
7
8
9
10 > xml复制代码<web-app>
> ...
> <listener>
> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
> </listener>
> ...
> </web-app>
>
>
>
- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
- global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。
案例演示
singleton
1 | less复制代码@Configurable |
测试代码
1 | ini复制代码public class text { |
从下图可以看到,bean1 == bean2
Layz-bean
@Layz赖加载主要是针对的是单例模式下,单例模式下ioc容器初始化时,就将bean对象注入到了容器中,@Layz注解可以让容器创建时不去注册容器,而是等到第一次调用时才去注册bean对象。此时,创建的对象依然是单例模式!
使用语法
1 | less复制代码// 配置类 |
测试
@Conditional
@Conditional注解是根据制定条件来进行注册,需要我创建配置条件的配置类,如果条件满足就进行注册,不满足就不去注册。
语法
配置类
1 | less复制代码@Configurable |
条件类必须去实现Condition接口,并添加为实现的方法!
1 | java复制代码public class winCondition implements Condition{ |
案例
需求根据当前操作系统去注册组件。
1 | less复制代码// 配置类 |
条件配置类
1 | java复制代码public class winCondition implements Condition{ |
1 | java复制代码public class linuxCondition implements Condition{ |
测试…
@import
- @Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中
- 加入IOC容器的方式有很多种,@Import注解就相对很牛皮了,@Import注解可以用于导入第三方包 ,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷
- @Import注解有三种用法
第一种用法:直接填class数组
直接填对应的class数组,class数组可以有0到多个。对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 ,比如com.yc.类名
1 | ruby复制代码@Import({ 类名.class , 类名.class... }) |
第二种用法:ImportSelector方式【重点】
这种方式的前提就是一个类要实现ImportSelector接口,假如我要用这种方法,目标对象是Myclass这个类,分析具体如下:
创建Myclass类并实现ImportSelector接口
1 | typescript复制代码public class Myclass implements ImportSelector { |
以上分析完毕之后,具体用法步骤如下:
第一步:创建Myclass类并实现ImportSelector接口,这里用于演示就添加一个全类名给其返回值
1 | typescript复制代码public class Myclass implements ImportSelector { |
第二步:编写TestDemo 类,并标注上使用ImportSelector方式的Myclass类
1 | csharp复制代码@Import({TestDemo2.class,Myclass.class}) |
第三步:编写打印容器中的组件测试类
1 | arduino复制代码** |
第三种用法:ImportBeanDefinitionRegistrar方式
同样是一个接口,类似于第二种ImportSelector用法,相似度80%,只不过这种用法比较自定义化注册,具体如下:
1 | typescript复制代码public class Myclass2 implements ImportBeanDefinitionRegistrar { |
第二步:编写代码,自定义注册bean
1 | java复制代码public class Myclass2 implements ImportBeanDefinitionRegistrar { |
第三步:编写TestDemo 类,并标注上使用ImportBeanDefinitionRegistrar方式的Myclass2类
1 | csharp复制代码@Import({TestDemo2.class,Myclass.class,Myclass2.class}) |
@FactoryBean
编写配置类
1 | kotlin复制代码// 标记这是一个Spring配置类 |
测试类
1 | ini复制代码public class SpringDemo { |
最后
感谢你看到这里,文章有什么不足还请指正,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!
本文转载自: 掘金