注解开发

 我们前面讲过没使用注解方式开发定义的时候,是以下面的形式进行写代码的:

spring.xml文件:

 BookDaoImpl:

 程序测试:

思考:以上的代码怎么使用注解开发的形式进行实现呢: 演示如下

一、注解开发定义bean

代码演示如下所示:

spring的xml配置文件:(这里只需要做的就是添加context的xmlns和http标签,然后开启注解扫描) 扫描的目的就是寻找扫描的包下是否有@Component("#")注解,该注解是获取bean的

 BookDaoImpl:(这里只需要做的就是配上注解组件)

最后给该注解加上值后,通过该值(bookDao)就能获取到IOC容器中被管理的对象了/bean了(和没使用注解理论是一样的)

二、纯注解开发模式

纯注解开发模式:也就是说使用java类代替了spring的xml配置文件 【也就是说:我们不再有spring的xml配置文件了,该文件我们用java类给代替了】

代码演示如下: (注意:spring的xml配置文件已经被我们的java类代替掉了)

java类代替的spring的xml配置文件:

package com.itheima.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

//声明当前类为Spring配置类
/*

@Configuration注解相当于spring的xml配置文件中的如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


</beans>
* */


/*

@ComponentScan({"com.itheima.service","com.itheima.dao"})注解相当于spring的xml配置文件中的如下内容:

 <!--重点:开启注解扫描( 也就是说扫描com.itheima包下是否有类用了注解的方式 )-->
    <context:component-scan base-package="com.itheima"/>

 */
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service","com.itheima.dao"}) // 可以使用数组的方式,多注解扫描形式(扫描该包下是否有@Component("#")的注解)
public class SpringConfig {
}

 被扫描出来的加了获取bean对象的注解BookDaoImpl类:

 通过被扫描出来的加了bean对象的注解里面的值,可以拿到该被管理的BookDaoImpl对象:

 三、注解开发bean作用范围与生命周期管理

java类代替spring的xml配置文件类:

 com.itheima包下配置了注解bean的BookDaoImpl:

 

 3.1、没有用注解开发之前,我们想要把它变成非单例形式的时候,是在spring的xml配置文件当中,添加非单例形式的属性即可(默认情况下是单例形式),现在我们使用了纯注解开发形式,因此我们如何把代码变成非单例形式操作如下:

只需要配置上非单例的注解:@Scope("#")    prototype:非单例   singleton:单例

3.2、没使用注解开发前的时候,我们是在spring的xml配置文件中添加属性,然后来判断生命周期的,(也就是生命起始周期和生命销毁周期,并且生命销毁周期要记得关闭勾子,因为代码到save()方法 结束后java虚拟机就关闭了 生命销毁周期的方法就不会被执行 ),那么我们使用注解开发的时候,应该如何操作呢,代码演示如下:

注意1:无参数构造是先执行的

注意2:要想执行生命销毁周期的方法,必须要关闭勾子并且保证该IOC容器是单例形式

代码演示如下:

java代码代替spring的xml配置文件类:

 com.itheima包下含有bean注解的BookDaoImpl类:

 测序测试:

四、依赖注入

4.1、注入引用类型的依赖关系

引用类型的依赖关系格式:private BookDao bookDao; // 依赖关系  

代码演示如下:

java代替的spring的xml配置文件类:

 以前我们没使用注解开发的时候,处理依赖关系是通过在spring的xml配置文件当中添加处理依赖标签,然后通过setter注入方式或者构造器注入方式进行处理的,

现在我们使用注解开发方式了 就直接使用自动装配(简单、粗暴)

com.itheima包下含有bean注解@Service的BookServiceImpl类:

BookDaoImpl依赖类(依赖类BookDao只有一个的时候,那么自动装配就会自动找到该依赖类,然后处理依赖关系,也可以调用该依赖类中的save方法了,如果依赖类有多个,那么就会有可能出现小问题):

 测序测试:

 4.1.1、但是使用注解自动装配的形式,会有下面的问题:

 因为依赖关系是BookService和BookDao之间的依赖关系,如果被依赖的类当中有两个实现BookDao依赖对象的类的时候,那么注解自动装配就不知道帮我们装配哪一个了,所以就出现问题了:

运行结果:(简单点的说,就是自动装配不知道选用这两个实现BookDao对象的类中的哪一个了,所以还不如直接给你报错

4.1.2、那么如何解决装配多个依赖类中的其中一个这个问题呢:

第一步:给依赖类起上bean注解的值

 第二步:加上@Qualifer注解并加上想装配的依赖类的注解bean的值

因为依赖类中@Repository("bookDao") //相当于拿到: <bean id="bookDao" class="com.itheima.dao.Impl.BookDaoImpl" />   被管理的对象了

也就是说加上@Qualifer注解并加上想装配的依赖类的注解bean的值就相当于拿到依赖类的对象了,也就处理了依赖关系: private BookDao bookDao = new BookDaoImpl();格式

 

4.2、注入简单类型的依赖关系

以前没有用注解开发的时候,处理简单类型的依赖关系,我们是通过在spring的xml配置文件当中使用标签属性的方式来进行依赖处理的,现在我们使用注解的方式演示如下:

只需要在简单类型当中用@Value("#")注解即可:

java代替spring中的xml配置文件的类:

 BookServiceImpl:

 被依赖的BookDao对象:(里面做的有简单类型注入)

 测试程序:

4.3、如何使用注解的方式加载properties文件

第一步:首先要现在java代替的spring的xml配置文件当中加上@PropertySource("#")注解形式

注意1:该注解里面可以使用数组的形式,配置多个properties文件 (使用数组配置多个properties文件的时候,一定要保证这几个properties文件存在

注意2:该注解内不支持通配符格式 (就是以前我们没使用注解开发时加载properties文件形式)

 jdbc.properties文件:

 第二步:在简单类型注入中加上@Value("#")注解,并且使用${占位符}  【占位符:properties文件中的左边属性名】

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值