Spring04 —— Spring注解开发

学习完Spring核心配置文件 xml的配置,我们再来看看Spring使用注解进行开发。希望我的笔记能够帮助到您!

往期文章

Spring01 —— Spring概念及快速入门
Spring02 —— Spring配置文件详解和依赖注入
Spring03 —— SpringAPI和在Spring中配置数据源


一、Spring注解开发

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。

1.1、Spring原始注解

Spring原始注解主要是替代xml的配置

在这里插入图片描述

注意:

使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要 进行扫描以便识别使用注解配置的类、字段和方法。

1.1.1、开发环境完善

1、新建一个modulespring_ioc_anno

导入依赖坐标

<dependencies>
	<!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>
	<!-- 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
	<!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.37</version>
    </dependency>

    <!-- C3P0连接池 -->
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    <!-- Druid连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>

</dependencies>

2、创建userdao userservice 在userservice中注入userDao

使用xml文件配置的方式完成

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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
">

    <!-- 1、加载配置文件jdbc.properties   -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--  配置数据源  -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--  userDao  -->
    <bean id="userDao" class="com.zhou.dao.impl.UserDaoImpl"></bean>

    <!--  userService  -->
    <bean id="userSerice" class="com.zhou.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>

</beans>

4、测试

在这里插入图片描述

1.1.2、使用原始注解替代xml配置

替换Userdao的配置

在这里插入图片描述

替换userService

在这里插入图片描述

告诉spring容器 我配置了注解 去扫描注解

<!--  配置组件扫描  -->
<context:component-scan base-package="com.zhou" />

测试:

在这里插入图片描述

1.1.3、衍生注解

@Controller @Service @Repository

在上述的注解配置中我们都使用的是@Component 不好区分是哪一层的bean实例

userDao

在这里插入图片描述

userservice

在这里插入图片描述

1.1.4、小细节

第一个细节点:

如果使用的是xml配置方式 那么set方法必须要有;如果使用的是注解开发方式 那么set方法可以省略不写

在这里插入图片描述

第二个细节点:

@Autowired 按照数据类型从spring容器中进行匹配 但是如果Spring容器中存在多个该类型的bean那么就会注入失败 它不知道该注入哪一个bean

第三个细节点:

@Qualifier(“userDao”) 是按照id名称从Spring容器中进行过匹配 此处要结合Autowired一起使用,如果不结合@Autowired一起使用那么就会报错 如下:

在这里插入图片描述

更简化的写法 是 @Resource(name = " ")注解 作用相当于 @autowired 和@Qualifier一起使用

在这里插入图片描述

在这里插入图片描述

1.1.5、@Value注入普通数据类型

在这里插入图片描述

在这里插入图片描述

但是在基础就学过 这样搞注入还不如我直接写 直接赋值呢,

private String username = "张无忌"; 

@Value还有更有用的用处 他可以去找Spring容器中对应key的值 将value赋给该变量 如:

@Value("${jdbc.username}")
private String username;

在这里插入图片描述

1.1.6、@Scope标注bean的作用范围

在这里插入图片描述

1.1.7、@PostConstruct标注初始化方法 @PreDestroy标注销毁方法

在这里插入图片描述

在这里插入图片描述

1.2、Spring新注解

使用上面的注解还不能呢完全替代xml配置文件,还需要使用注解替代的配置如下:

1、非自定义的Bean的配置: 比如数据源datasource

2、加载properties文件的配置:context:property-placeholder

3、组件扫描的配置:context:component-scan

4、引入其他配置文件:分模块开发import

在这里插入图片描述

快速入门:

【1】新建一个类 使用@Configuration标注 标识这个类是一个Spring的核心配置类

@Configuration  // 标志该类是Spring的核心配置类
public class SpringConfiguration {

 
    }
}

【2】配置组件扫描 告诉Spring扫描哪些注解

@Configuration  // 标志该类是Spring的核心配置类
@ComponentScan("com.zhou")  // 配置组件扫描
public class SpringConfiguration {

   
    }
}

【3】非自定义的Bean 使用@Bean 将某一个方法的返回值存储到Spring容器中

这里需要创建一个获取datasource的方法 使用@Bean标注该方法

@Configuration  // 标志该类是Spring的核心配置类
@ComponentScan("com.zhou")  // 配置组件扫描
public class SpringConfiguration {

    @Bean("dataSource")  // Spring个会将该方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource() throws PropertyVetoException {
        // 创建数据源
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        // 设置数据源连接参数
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/study");
        dataSource.setUser("root");
        dataSource.setPassword("123456");
        return dataSource;
    }
}

【4】加载jdbc.properties配置文件

上述代码中数据库的连接信息是紧耦合的,我们需要使用抽取配置文件的方式进行解耦合

在核心配置类山使用@PropertySource加载jdbc.properties文件

@Configuration  // 标志该类是Spring的核心配置类
@ComponentScan("com.zhou")  // 配置组件扫描
@PropertySource("classpath:jdbc.properties")  // 加载外部配置文件 <context:property-placeholder location="classpath:jdbc.properties"/>
public class SpringConfiguration {

    @Bean("dataSource")  // Spring个会将该方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource() throws PropertyVetoException {
        // 创建数据源
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        // 设置数据源连接参数
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/study");
        dataSource.setUser("root");
        dataSource.setPassword("123456");
        return dataSource;
    }
}

那么加载jdbc.properties怎么使用呢,这里并不能像在xml配置文件中可以使用spel表达式(${jdbc.driver})的方式,

加载了jdbc.properties那么spring容器中就存在这样的一些键值对 我们可以使用@Value进行注入

@Configuration  // 标志该类是Spring的核心配置类
@ComponentScan("com.zhou")  // 配置组件扫描
@PropertySource("classpath:jdbc.properties")
// 加载外部配置文件 <context:property-placeholder location="classpath:jdbc.properties"/>
public class SpringConfiguration {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String user;
    @Value("${jdbc.password}")
    private String passwd;

    @Bean("dataSource")  // Spring个会将该方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource() throws PropertyVetoException {
        // 创建数据源
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        // 设置数据源连接参数
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(user);
        dataSource.setPassword(passwd);
        return dataSource;
    }
}

【5】@import引入其他模块的Spring配置文件

新建一个DataSourceConfiguration类 将datasource相关的剪切过去,在Spring的核心配置类中引入DatasourceConfiguration

@PropertySource("classpath:jdbc.properties") // 加载外部配置文件 <context:property-placeholder location="classpath:jdbc.properties"/>
public class DataSourceConfiguration {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String user;
    @Value("${jdbc.password}")
    private String passwd;

    @Bean("dataSource")  // Spring个会将该方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource() throws PropertyVetoException {
        // 创建数据源
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        // 设置数据源连接参数
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(user);
        dataSource.setPassword(passwd);
        return dataSource;
    }
}
@Configuration  // 标志该类是Spring的核心配置类
@ComponentScan("com.zhou")  // 配置组件扫描
@Import({DataSourceConfiguration.class})  // 分模块开发 引入其他配置文件,数组,可以导入多个
public class SpringConfiguration {

}

【6】测试代码:

// 全注解开发 需要使用 AnnotationConfigApplicationContext
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
userService.save();

在这里插入图片描述

到此,Spring的注解开发基本就掌握了,注意区分配置文件配置和使用注解开发的区别
使用注解开发需要在核心配置文件中配置组件扫描 组件扫描需要用congtext命名空间,所以需要引入context命名空间
使用注解完全代替xml配置,那么在获取Spring应用上下文的时候需要使用AnnotationConfigApplicationContext实现类来获取。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值