spring之注解学习

Spring的注解:

1.创建配置类(只需在类上加上@Configuration注解)

2.存放bean
@Bean + 方法名的返回值
3. 取bean
之前的xml取bean:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
注解形式取bean:
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
注意:两种形式IOC容器是独立的

重点:注解形式存放bean
1. @Configuration注解(配置类)
2.形式:
三层组件(@Controller Service Dao -> @Component):
a.给三层组件 分别加注解
b.注入到IOC容器:
①配置扫描器(ComponentScan),扫描注解
② 注解 在配置类(MyConfig)中加上@ComponentScan(“org.notial”)
非三层组件(@Component):
类前面加上@Bean注解(在@Configuration中即配置类)

作用域(@Scope(“xxx”)):
默认是单例模式(singleton),还有原型模式(prototype)
singleton:容器初始化时会创建对象,但可以设置延迟加载(懒加载@Lazy)即在第一次使用时产生
prototype:容器初始化时未创建实例,在getBeans()时才出创建

条件注解 springboot:

可以让某一个bean在某些条件下 加入IOC容器, 其他情况下不加IOC
a. 准备beans
b. 给每个bean设置条件(条件bean), 必须实现接口Condition
c. 根据条件 加入IOC容器:
条件可以在Edit Configurations 中的VM options中修改 例如-DcarType=oil

回顾给IOC容器加入beans的方法:
1. applicationContext.xml中
2.通过注解(全部在@Configuration配置配中设置):
a. 三层组件: 扫描器(@ComponentScan) + 三层注解
b. 非三层组件:
@Bean + 返回值
@import
FactortBean(工厂Bean)

@import使用:
1.直接编写到@Import中,并且id值 时全类名
2.自定义ImportSelector接口的实现类, 通过selectimports方法实现(方法的返回值就是纳入IOC容器的bean)
再通过@Import注解写入该实现类
3.自定义ImportBeanDefinitionRegistrar接口的实现类

FactortBean(工厂Bean):

1.实现类实现FactoryBean接口
2.注册到配置类(加&具体区分哪个bean,加上&则是工厂本身,不加则是工厂创建的实例)

Bean的生命周期:创建(new …)、初始化(赋初值)、 …、销毁 (servlet)

方法一:
xml:
init-method=“myInit” destroy-method=“myDestroy”
注解:
@Bean(value=“stu”,initMethod = “myInit”,destroyMethod = “myDestroy”)

方法二:
JAVA规范:JSR250
@PostConstruct:相当于方法一的init
@PreDestroy:相当于方法一的destroy

方法三:两个接口
接口:适用于三层组件(扫描器+三层组件)
InitializingBean初始化
DisposableBean 销毁

初始化:只需要 实现InitializingBean中的afterPropertiesSet()方法
销毁:实现DisposableBean 中的destroy()方法

问题:要在SPring IOC容器中操作:操作方式 对象:Bean+返回 ,三层组件

->如果是注解形式 , 随便写一个方法 ,然后加上相应注解即可
如果是接口形式,必须 实现接口中规定的方法

方法四:(给容器中的所有Bean加初始化、销毁)一个接口
接口:适用于三层组件
接口BeanPostProcessor:拦截了所有中容器的Bean

—自动装配 : 三层组件(4个注册+扫描器)
@Autowired
Controller->Service->Dao
三层组件
通过@Autowired从Ioc容器中 根据类型自动注入(没有调用setXxx()方法)
-如果@Autowired在属性前标注,则不调用setXxx;如果标注在setXxx前面 ,则调用setXxx
-不能放在方法的参数前
@Autowired
private Xxx xx;

public void aa()
{

}

@Autowired
public void setXxx(xx xx)
{

}

Bean+返回值:
@Autowired 在方法的参数前(也可以省略)、方法前 (构造方法:特殊,如果只有一个有参构造方法,则构造方法前的@Autowired也可以省略)

public void setXxx(@Autowired xx xx)
{

}

之前:@Autowired 根据类型匹配:
三层注入方式/@Bean+返回值
1.如果有多个类型相同的,匹配哪个?
报错。 /默认值@primary
2.能否根据名字匹配?
可以,结合 @Qualifier(“stuDao2”)使用。

3.如果有0个类型相同,默认报错;可以修改成不注入(null),@Autowired(required=false)

自动注入方式一: @Autowired (Spring) ,默认根据类型
自动注入方式二 @Resource(JSR250),默认根据名字 (如果 有名字,根据名字匹配;如果没有名字,先根据名字查找,如果没找到,再根据类型查找);也可以通过name或type属性 指定根据名字 或类型找。
自动注入方式一: @Inject(JSR330),额外引入javax.inject.jar,默认根据类型匹配

—利用Spring底层组件进行开发 (三层组件)
能够供我们使用的组件,都是Aware的子接口,即XxxxAware
以ApplicationContextAware为例:实现步骤
a.实现ApplicationContextAware,
b.重写其中的方法,都包含了一个对象。只需要将该对象 赋值到属性中即可

有什么用:例如ApplicationContextAware,可以通过该接口 获取到Ioc容器对象。
执行时间: 如果在main()中new Ioc容器: 先执行ApplicationContextAware实现类中的方法,通过该方法传入IoC容器 供我们自己使用; 然后再将该容器通过new返回给用户

BeanNameAware:

–环境切换:@Profile
Spring:切换环境

激活方式一:
-Dspring.profiles.active=@Profile环境名
-Dspring.profiles.active=myApple

数据库环境:
@Profile
127.0.0.1 scott tiger

@Profile
192.168…
激活方式二:
硬编码

坑:错误写法
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class) ;

ConfigurableEnvironment environment = (ConfigurableEnvironment)context.getEnvironment();
environment.setActiveProfiles(“myBanana”);

其中AnnotationConfigApplicationContext中有一个refresh()操作:会将我们设置的一些参数还原
没激活 |->进行激活 ->刷新 ->没激活

流程调整:
没激活->进行激活 | ->刷新

什么时候设置 保存点|: 配置类的编写处
IoC容器在使用时必须refresh() ;如果是有参构造,内部已经刷新;如果无参构造,需要手工刷新。

监听器:
可以监听事件 ,监听的对象必须是 ApplicationEvent自身或其子类/子接口
方式一:
1必须实现ApplicationListener接口,

方式二:注解

(语法上 可以监听任意事件,但建议 ApplicationEvent自身或其子类/子接口)
Spring:要让SPring识别自己,必须加入IOc容器(Bean+返回值| 注解+扫描器)

自定被监听事件
a.自定义类 实现ApplicationEvent接口(自定义事件)
b.发布事件
context.publishEvent(自定义事件);

发布了29 篇原创文章 · 获赞 0 · 访问量 1201

猜你喜欢

转载自blog.csdn.net/flipped___/article/details/104326448