1. Spring中的常用注解

  注解配置和xml配置要实现的功能都是一样的,都要降低程序的耦合,只是配置的形式不一样

  xml中配置示例:

  注解分类:

  1.用于创建对象的注解

  它们的作用就和在xml中编写一个bean标签是一样的

  2.用于注入数据的注解

  它们的作用就和在xml中bean标签中写一个property标签是一样的

  3.用于改变作用范围的注解

  它们的作用就和在xml中bean标签中使用scope属性实现的功能是一样的

  4.和生命周期相关的注解

  它们的作用就和在bean标签中使用init-method和destroy-method属性是一样的

  1.1 用于创建对象的注解

  相当于:

  (1)@Component

  作用:

  用于把当前类对象存入Spring容器中,相当于在 xml 中配置一个 bean。

  属性:

  value:用于指定bean的id,当我们不写时,它的默认值是当前类名且首字母改小写

  如果注解中有一个属性,且这个属性是value时,可以省略value=,即一个省略属性的值,就是value的值

  示例:

  对于注解配置,我们需要修改配置文件xml

  查找约束文件

  bean.xml

  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

  https://www.springframework.org/schema/beans/spring-beans.xsd

  http://www.springframework.org/schema/context

  https://www.springframework.org/schema/context/spring-context.xsd">

  IAccountDao.java

  package cn.cqu.dao;

  /**

  * 账户的持久层接口

  */

  public interface IAccountDao {

  /**

  *模拟保存账户

  */

  void saveAccount();

  }

  AccountDaoImpl.java

  package cn.cqu.dao.impl;

  import cn.cqu.dao.IAccountDao;

  import org.springframework.stereotype.Component;

  /**

  * 账户的持久层实现类

  *

  *

  *scope="" init-method="" destroy-method="">

  *

  *

  */

  @Component("accountDao")

  public class AccountDaoImpl implements IAccountDao {

  public void saveAccount() {

  System.out.println("保存了账户");

  }

  }

  Client.java

  package cn.cqu.ui;

  import cn.cqu.dao.IAccountDao;

  import org.springframework.context.ApplicationContext;

  import org.springframework.context.support.ClassPathXmlApplicationContext;

  /**

  * 获取spring的IOC核心容器,并根据id获取对象

  */

  public class Client {

  public static void main(String[] args) {

  //1.获取核心容器对象

  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

  //2.根据id获取bean对象

  IAccountDao dao = ac.getBean("accountDao",IAccountDao.class);

  System.out.println(dao);

  }

  }

  

  (2)@Controller

  一般用于控制层

  (3)@Service

  一般用于服务层

  (4)@Repository

  一般用于持久层

  以上三个注解它们的作用和属性和@Component是一模一样的

  它们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰

  细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。

  1.2 用于注入数据的注解

  相当于:

  (1)@Autowired

  出现位置:

  可以是成员变量上,也可以是方法上

  细节:

  在使用注解注入时,set方法就不是必须的了

  作用:

  自动按照类型注入,只要容器中有一个唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功

  如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错

  示例代码:

  package cn.cqu.dao;

  /**

  * 账户的持久层接口

  */

  public interface IAccountDao {

  /**

  *模拟保存账户

  */

  void saveAccount();

  }

  package cn.cqu.dao.impl;

  import cn.cqu.dao.IAccountDao;

  import org.springframework.stereotype.Component;

  /**

  * 账户的持久层实现类

  *

  */

  @Component("accountDao")

  public class AccountDaoImpl {//implements IAccountDao

  public void saveAccount() {

  System.out.println("保存了账户");

  }

  }

  注意此处我们对implements IAccountDao进行了注释,即AccountDaoImpl不是IAccountDao类型了

  package cn.cqu.service;

  /**

  * 账户的service层接口

  */

  public interface IAccountService {

  void saveAccount();

  }

  package cn.cqu.service.impl;

  import cn.cqu.dao.IAccountDao;

  import cn.cqu.service.IAccountService;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.stereotype.Service;

  @Service("accountService")

  public class AccountServiceImpl implements IAccountService {

  @Autowired

  private IAccountDao accountDao;

  @Override

  public void saveAccount() {

  accountDao.saveAccount();

  }

  }

  package cn.cqu.ui;

  import cn.cqu.service.IAccountService;

  import org.springframework.context.ApplicationContext;

  import org.springframework.context.support.ClassPathXmlApplicationContext;

  /**

  * 获取spring的IOC核心容器,并根据id获取对象

  */

  public class Client {

  public static void main(String[] args) {

  //1.获取核心容器对象

  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

  //2.根据id获取bean对象

  IAccountService as = ac.getBean("accountService",IAccountService.class);

  as.saveAccount();

  }

  }

  取消上述注释,成功运行

  如果有多个类型匹配时,它先按照类型找到满足该类型的几个Object,然后根据变量名和key去匹配,如果在key中找不到与变量名匹配的,就报错

  示例代码:

  package cn.cqu.dao;

  /**

  * 账户的持久层接口

  */

  public interface IAccountDao {

  /**

  *模拟保存账户

  */

  void saveAccount();

  }

  package cn.cqu.dao.impl;

  import cn.cqu.dao.IAccountDao;

  import org.springframework.stereotype.Component;

  /**

  * 账户的持久层实现类

  *

  */

  @Component("accountDao1")

  public class AccountDaoImpl1 implements IAccountDao{

  public void saveAccount() {

  System.out.println("保存了账户1111111");

  }

  }

  package cn.cqu.dao.impl;

  import cn.cqu.dao.IAccountDao;

  import org.springframework.stereotype.Component;

  /**

  * 账户的持久层实现类

  *

  */

  @Component("accountDao2")

  public class AccountDaoImpl2 implements IAccountDao{

  public void saveAccount() {

  System.out.println("保存了账户2222222");

  }

  }

  package cn.cqu.service;

  /**

  * 账户的service层接口

  */

  public interface IAccountService {

  void saveAccount();

  }

  package cn.cqu.service.impl;

  import cn.cqu.dao.IAccountDao;

  import cn.cqu.service.IAccountService;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.stereotype.Service;

  @Service("accountService")

  public class AccountServiceImpl implements IAccountService {

  @Autowired

  private IAccountDao accountDao;

  @Override

  public void saveAccount() {

  accountDao.saveAccount();

  }

  }

  package cn.cqu.ui;

  import cn.cqu.service.IAccountService;

  import org.springframework.context.ApplicationContext;

  import org.springframework.context.support.ClassPathXmlApplicationContext;

  /**

  * 获取spring的IOC核心容器,并根据id获取对象

  */

  public class Client {

  public static void main(String[] args) {

  //1.获取核心容器对象

  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

  //2.根据id获取bean对象

  IAccountService as = ac.getBean("accountService",IAccountService.class);

  as.saveAccount();

  }

  }

  注意此时类AccountServiceImpl中仍然是

  

  

  修改为

  

  ,运行结果如下

  

  修改为

  

  ,运行结果如下

  

  通过以上可以发现当有多个类型需要匹配时,我们需要修改属性变量名,但是通过以下注解@Qualifier与@Autowired我们就可以避免修改变量名

  (2)Qualifier

  作用:

  按照类型注入的基础上再按照名称Qualifier中value值注入

  它在给类成员注入时,不能单独使用,但是在给方法参数注入时可以

  属性:

  value:用于指定注入bean的id

  注意:

  @Qualifier必须和@Autowired一起使用

  示例:

  上述代码中,我们仍然使用accountDao,当加入注解@Qualifier

  第一种:

  

  运行结果:

  

  第二种:

  

  运行结果:

  

  (3)Resource

  作用:

  直接按照bean的id注入,它可以独立使用

  Resource可以直接指定bean的id,作用相当于@Qualifier必须和@Autowired一起使用的作用

  属性:

  name:用于指定bean的id

  示例:

  

  

  

  

  以上三个注解都只能注入其他类型的数据,而基本类型和String类型无法使用上述注解实现,

  另外,集合类型的注入只能通过XML来实现

  (4)@Value

  作用:

  用于注入基本类型和String类型的数据

  属性:

  value:用于指定数据的值,它可以使用Spring中的SpEL(即Spring的EL表达式)

  SpEL写法:${表达式}

  1.3 用于改变作用范围的注解

  相当于:

  Scope

  作用:

  用于指定bean的作用范围

  属性:

  value:指定范围的取值

  常用取值:singleton、prototype

  当我们不指定,默认情况下也是单例的

  示例:

  对上述代码中main方法中做如下修改

  package cn.cqu.ui;

  import cn.cqu.service.IAccountService;

  import org.springframework.context.ApplicationContext;

  import org.springframework.context.support.ClassPathXmlApplicationContext;

  /**

  * 获取spring的IOC核心容器,并根据id获取对象

  */

  public class Client {

  public static void main(String[] args) {

  //1.获取核心容器对象

  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

  //2.根据id获取bean对象

  IAccountService as01 = ac.getBean("accountService",IAccountService.class);

  IAccountService as02 = ac.getBean("accountService",IAccountService.class);

  System.out.println(as01==as02);

  }

  }

  

  当我们使用@Scope注解设置它的value为prototype时

  无锡人流医院哪家好 http://www.wxbhnkyy120.com/

  

  1.4 和生命周期相关的注解

  相当于:

  (1)Predestroy

  作用:

  用于指定销毁方法

  (2)PostConstruct

  作用:

  用于指定初始化方法

  示例代码:

  修改上述代码中AccountServiceImpl如下

  package cn.cqu.service.impl;

  import cn.cqu.dao.IAccountDao;

  import cn.cqu.service.IAccountService;

  import org.springframework.context.annotation.Scope;

  import org.springframework.stereotype.Service;

  import javax.annotation.PostConstruct;

  import javax.annotation.PreDestroy;

  import javax.annotation.Resource;

  @Service("accountService")

  public class AccountServiceImpl implements IAccountService {

  @Resource(name="accountDao2")

  private IAccountDao accountDao;

  @Override

  public void saveAccount() {

  accountDao.saveAccount();

  }

  @PostConstruct

  public void init(){

  System.out.println("初始化方法执行了");

  }

  @PreDestroy

  public void destroy(){

  System.out.println("销毁方法执行了");

  }

  }

  修改main如下

  package cn.cqu.ui;

  import cn.cqu.service.IAccountService;

  import org.springframework.context.support.ClassPathXmlApplicationContext;

  /**

  * 获取spring的IOC核心容器,并根据id获取对象

  */

  public class Client {

  public static void main(String[] args) {

  //1.获取核心容器对象

  ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

  //2.根据id获取bean对象

  IAccountService as = ac.getBean("accountService",IAccountService.class);

  as.saveAccount();

  ac.close();

  }

  }

  运行结果:

  

  1.5 关于 Spring 注解和 XML 的选择问题

  注解的优势:

  配置简单,维护方便(我们找到类,就相当于找到了对应的配置)。

  XML 的优势:

  修改时,不用改源码。不涉及重新编译和部署。

  Spring 管理 Bean 方式的比较

Spring中基于注解的IOC(一):基础介绍的更多相关文章

  1. Spring中基于注解的IOC(二):案例与总结

    2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...

  2. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  3. 10 Spring框架--基于注解的IOC配置

    1.工程环境搭建 2.基于注解的IOC配置 IOC注解的分类 (1)用于创建对象的 他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的@Component: 作用: ...

  4. spring的基于注解的IOC配置

    1.配置文件配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http: ...

  5. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  6. spring中基于注解使用ehcache

    继续上篇,这篇介绍服务层缓存,基于注解的方式使用ehcache 注解的标签主要有4个:@Cacheable.@CacheEvict.@CachePut.@Caching,他们的用法是: @Cachea ...

  7. Spring中基于注解方式管理bean

    操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...

  8. spring基于注解的IoC以及IoC的案例

    1.Spring中IoC的常用注解 1.1明确: (1)基于注解的配置和xml的配置要实现的功能都是一样的,都是要降低程序之间的耦合,只是配置的形式不一样 2.案例:使用xml方式和注解方式实现单表的 ...

  9. Spring 中基于 AOP 的 @AspectJ注解实例

    @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格.通过在你的基于架构的 XML 配置文件中包含以下元素,@AspectJ 支持是可用的 ...

随机推荐

  1. Git工具使用基础

    Git 是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多的影响,文章分为两部分 ...

  2. 修改了celery任务老是执行失败,跟shell中调试的结果不同

    因为没有重启celery,没有删除celerybeat-schedule,导致使用的task任务一直是原来缓存的,所以代码一直无法生效,也是日了狗了

  3. selenium--获取HTML源码断言和URL地址

    获取HTML源码 from selenium import webdriver import unittest class Test_source(unittest.TestCase): def Te ...

  4. Qt常用类——QWidget

    QWidget类是所有用户界面对象的基类. Widget是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己. 每个Widget都是矩形的,它们按照Z-order进行排序.

  5. Docker整合dockerfly实现UI界面管理(单机版)

    一.搜索镜像 docker search dockerfly 二.根据镜像使用排名(一般情况下拉取使用率最高的镜像名),我这里使用的是阿里云镜像地址 docker pull registry.cn-h ...

  6. IDEA调试进入class文件

    今天用IDEA调试时,一直进入class文件,而没有进入java文件. 错误原因 出现这种情况,有可能是Module有多个同名的依赖,调试时程序进入了同名的jar包里面,而不是同名的Module. 如 ...

  7. DDD(Domain Driven Design) 架构设计

    一.为什么要分层 分层架构是所有架构的鼻祖,分层的作用就是隔离,不过,我们有时候有个误解,就是把层和程序集对应起来,就比如简单三层架构中,在你的解决方案中,一般会有三个程序集项目:XXUI.dll.X ...

  8. 关于微信小程序前端Canvas组件教程

    关于微信小程序前端Canvas组件教程 微信小程序Canvas接口函数 ​ 上述为微信小程序Canvas的内部接口,通过熟练使用Canvas,即可画出较为美观的前端页面.下面是使用微信小程序画图的一些 ...

  9. 第3课 auto类型推导(2)

    第3课 auto类型推导(2) 一.使用auto的优势 (一)避免使用未初始化变量 (二)可简化变量/对象类型的声明 (三) 在某些场合无法判断出类型时,可用auto自动推导(如lambda表达式) ...

  10. pv删除不掉

    [root@master pv]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS ...