一、环境准备

先来准备下环境:

  • 创建一个Maven项目

  • pom.xml添加Spring的依赖

    1. <dependencies>
    2.    <dependency>
    3.        <groupId>org.springframework</groupId>
    4.        <artifactId>spring-context</artifactId>
    5.        <version>5.2.10.RELEASE</version>
    6.    </dependency>
    7. </dependencies>
  • resources下添加applicationContext.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4.       xsi:schemaLocation="
    5.            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    6.    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    7. </beans>
  • 添加BookDao、BookDaoImpl、BookService、BookServiceImpl类

    1. public interface BookDao {
    2.    public void save();
    3. }
    4. public class BookDaoImpl implements BookDao {
    5.    public void save() {
    6.        System.out.println("book dao save ..." );
    7.   }
    8. }
    9. public interface BookService {
    10.    public void save();
    11. }

    12. public class BookServiceImpl implements BookService {
    13.    public void save() {
    14.        System.out.println("book service save ...");
    15.   }
    16. }
  • 创建运行类App

    1. public class App {
    2.    public static void main(String[] args) {
    3.        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    4.        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    5.        bookDao.save();
    6.   }
    7. }

最终创建好的项目结构如下:

二、注解开发定义bean

在上述环境的基础上,我们来看一看Spring是如何通过注解实现bean的定义开发?

步骤1:删除原XML配置

将配置文件中的<bean>标签删除掉

  1. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

步骤2:Dao上添加注解

在BookDaoImpl类上添加@Component注解

  1. @Component("bookDao")
  2. public class BookDaoImpl implements BookDao {
  3.    public void save() {
  4.        System.out.println("book dao save ..." );
  5.   }
  6. }

注意:@Component注解不可以添加在接口上,因为接口是无法创建对象的。

XML与注解配置的对应关系:

步骤3:配置Spring的注解包扫描

为了让Spring框架能够扫描到写在类上的注解,需要在配置文件上进行包扫描

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.       xsi:schemaLocation="
  5.            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.    <context:component-scan base-package="com.itheima"/>
  7. </beans>

说明:

component-scan

  • component:组件,Spring将管理的bean视作自己的一个组件

  • scan:扫描

base-package指定Spring框架扫描的包路径,它会扫描指定包及其子包中的所有类上的注解。

  • 包路径越多[如:com.itheima.dao.impl],扫描的范围越小速度越快

  • 包路径越少[如:com.itheima],扫描的范围越大速度越慢

  • 一般扫描到项目的组织名称即Maven的groupId下[如:com.itheima]即可。

步骤4:运行程序

运行App类查看打印结果

步骤5:Service上添加注解

在BookServiceImpl类上也添加@Component交给Spring框架管理

  1. @Component
  2. public class BookServiceImpl implements BookService {
  3.    private BookDao bookDao;

  4.    public void setBookDao(BookDao bookDao) {
  5.        this.bookDao = bookDao;
  6.   }

  7.    public void save() {
  8.        System.out.println("book service save ...");
  9.        bookDao.save();
  10.   }
  11. }

步骤6:运行程序

在App类中,从IOC容器中获取BookServiceImpl对应的bean对象,打印

  1. public class App {
  2.    public static void main(String[] args) {
  3.        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  4.        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
  5.        System.out.println(bookDao);
  6.        //按类型获取bean
  7.        BookService bookService = ctx.getBean(BookService.class);
  8.        System.out.println(bookService);
  9.   }
  10. }

打印观察结果,两个bean对象都已经打印到控制台

说明:

  • BookServiceImpl类没有起名称,所以在App中是按照类型来获取bean对象

  • @Component注解如果不起名称,会有一个默认值就是当前类名首字母小写,所以也可以按照名称获取,如

    1. BookService bookService = (BookService)ctx.getBean("bookServiceImpl");
    2. System.out.println(bookService);

对于@Component注解,还衍生出了其他三个注解@Controller@Service@Repository

通过查看源码会发现:

这三个注解和@Component注解的作用是一样的,为什么要衍生出这三个呢?

方便我们后期在编写类的时候能很好的区分出这个类是属于表现层业务层还是数据层的类。

知识点1:@Component等

名称 @Component/@Controller/@Service/@Repository
类型 类注解
位置 类定义上方
作用 设置该类为spring管理的bean
属性 value(默认):定义bean的id

三、纯注解开发模式

上面已经可以使用注解来配置bean,但是依然有用到配置文件,在配置文件中对包进行了扫描,Spring在3.0版已经支持纯注解开发

  • Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道

具体如何实现?

3.1 思路分析

实现思路为:

  • 将配置文件applicationContext.xml删除掉,使用类来替换。

3.2 实现步骤

步骤1:创建配置类

创建一个配置类SpringConfig

  1. public class SpringConfig {
  2. }
步骤2:标识该类为配置类

在配置类上添加@Configuration注解,将其标识为一个配置类,替换applicationContext.xml

  1. @Configuration
  2. public class SpringConfig {
  3. }
步骤3:用注解替换包扫描配置

在配置类上添加包扫描注解@ComponentScan替换<context:component-scan base-package=""/>

  1. @Configuration
  2. @ComponentScan("com.itheima")
  3. public class SpringConfig {
  4. }
步骤4:创建运行类并执行

创建一个新的运行类AppForAnnotation

  1. public class AppForAnnotation {

  2.    public static void main(String[] args) {
  3.        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
  4.        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
  5.        System.out.println(bookDao);
  6.        BookService bookService = ctx.getBean(BookService.class);
  7.        System.out.println(bookService);
  8.   }
  9. }

运行AppForAnnotation,可以看到两个对象依然被获取成功

至此,纯注解开发的方式就已经完成了,主要内容包括:

  • Java类替换Spring核心配置文件

  • @Configuration注解用于设定当前类为配置类

  • @ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式

    1. @ComponentScan({com.itheima.service","com.itheima.dao"})
  • 读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象

    1. //加载配置文件初始化容器
    2. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    3. //加载配置类初始化容器
    4. ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

知识点1:@Configuration

名称 @Configuration
类型 类注解
位置 类定义上方
作用 设置该类为spring配置类
属性 value(默认):定义bean的id

知识点2:@ComponentScan

名称 @ComponentScan
类型 类注解
位置 类定义上方
作用 设置spring配置类扫描路径,用于加载使用注解格式定义的bean
属性 value(默认):扫描路径,此路径可以逐层向下扫描

四、小结

  • @Component、@Controller、@Service、@Repository这四个注解

  • applicationContext.xml中<context:component-san/>的作用是指定扫描包路径,注解为@ComponentScan

  • @Configuration标识该类为配置类,使用类替换applicationContext.xml文件

  • ClassPathXmlApplicationContext是加载XML配置文件

  • AnnotationConfigApplicationContext是加载配置类

Java开发学习(十)----基于注解开发定义bean 已完成的更多相关文章

  1. Java开发学习(十三)----基于注解开发定义第三方bean及注解开发总结

    在前面的博客中定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,这个时候该怎么办? 遇到上述问题,我们就需要有一种更加 ...

  2. Java开发学习(十一)----基于注解开发bean作用范围与生命周期管理

    一.注解开发bean作用范围与生命周期管理 前面使用注解已经完成了bean的管理,接下来将通过配置实现的内容都换成对应的注解实现,包含两部分内容:bean作用范围和bean生命周期. 1.1 环境准备 ...

  3. Hystrix 基于注解开发

    不对地方,请指出!相互学习! 背景:Hystrix 没有无参构造函数,所以Spring管理bean时候没办法进行管理, 每个类都进行编码 个人感觉不方便,基于注解开发!方便速度快,不侵入代码!引入的j ...

  4. 【Java Web开发学习】Spring4条件化的bean

    [Java Web开发学习]Spring4条件化的bean 转载:https://www.cnblogs.com/yangchongxing/p/9071960.html Spring4引入了@Con ...

  5. Android(java)学习笔记219:开发一个多界面的应用程序之两种意图

    1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...

  6. Spring基于注解开发异常

    基于注解开发: 一开始:用的jar包: 百度查到: 导入aop包: 没用 有的说: Spring版本和jdk版本不匹配 于是我换成了4.0版本 导入的jar包: 还是报错. 解决办法:添加spring ...

  7. Android(java)学习笔记162:开发一个多界面的应用程序之两种意图

    1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...

  8. Java开发学习(十四)----Spring整合Mybatis及Junit

    一.Spring整合Mybatis思路分析 1.1 环境准备 步骤1:准备数据库表 Mybatis是来操作数据库表,所以先创建一个数据库及表 create database spring_db cha ...

  9. MyBatis学习04(注解开发)

    7.使用注解开发 7.1 面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好 在一个面 ...

随机推荐

  1. Arraylist面试三连问

    点赞在看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 本文在公众号文章已同步,还有各种一线大厂面试原题.我的学习系列笔记. Arraylist为什么要加transient? ArrayList源 ...

  2. tmux 快速上手

    tmux 介绍 截图 dwm + alacritty + tmux + neovim + ranger: 下载 tmux 可以说是一款 TUI 开发人员不可或缺的终端复用神器. $ yay -S tm ...

  3. centos7系统安装 VMware

    安装版本: CentOS-7-x86_64-DVD-2009.iso   下载地址:阿里巴巴开源镜像 第一步:打开虚拟机,新建虚拟机引导,选择高级,下一步. 第二步:默认下一步 第三步:选择最后一项, ...

  4. C++基础-6-继承

    6. 继承 1 #include<iostream> 2 using namespace std; 3 4 5 class Base { 6 public: 7 Base() { 8 m_ ...

  5. Git 日志提交规范

    Commit messages的基本语法 当前业界应用的比较广泛的是 Angular Git Commit Guidelines 具体格式为: <type>: <subject> ...

  6. 被迫开始学习Typescript —— interface

    一开始以为,需要使用 class 来定义呢,学习之后才发现,一般都是使用 interface 来定义的. 这个嘛,倒是挺适合 js 环境的. 参考:https://typescript.bootcss ...

  7. zabbix的web界面访问失败问题排查

    现象:用curl访问显示拒绝链接,查看zabbix-server日志也无异常 1.检查防火墙,SElinux是否关闭 2.检查zabbix-server服务是否启动 3.检查80端口是否被占用,比方是 ...

  8. git 本地项目关联新repo

    git initgit remote add origin repo-url git pull origin master --allow-unrelated-histories git add . ...

  9. 每天一个 HTTP 状态码 103

    103 Early Hints 103 Earyly Hints 是被用于在最终 HTTP 消息前返回一些响应头,常和 HTTP Header: Link 一起使用,让客户端在服务器还在准备(当前的这 ...

  10. Navicat破解激活流程

    ​​ ​ Navicat Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL.MariaDB.MongoDB.SQL Server.Oracle.Postg ...