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. Spring 整合 JPA

    spring 整合 jpa 客户的基本CRUD 依赖 <properties> <spring.version>4.2.4.RELEASE</spring.version ...

  2. 【java异常】【redis】ERR Client sent AUTH, but no password is set

    项目中使用jedis或redisson连接redis时,如果redis没有密码,但在配置文件中写为 spring: redis: database: 0 host: 127.0.0.1 passwor ...

  3. 【Linux】查看程序是否正常运行

    ps aux|grep redis-server ps -ef |grep redis netstat -tunple|grep 6379 netstat -lntp | grep 6379

  4. Scrapy笔记(1)- 入门篇

    Scrapy笔记01- 入门篇 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取(更确切来说, ...

  5. 提高 Visualforce 页面加载效率的小知识

    一般原则 在设计页面时,我们要将页面的功能降至最少,不要包含多余的功能和数据,以最大化提高运行效率 如果需要开发的功能可以通过 Salesforce 的标准功能实现,那么尽量使用标准功能,比如 工作流 ...

  6. Codeforces Round #603 (Div. 2) E - Editor(线段树,括号序列)

  7. 使用uwsgi+nginx部署项目

    Uwsgi:部署web应用程序 Nginx:反向代理,静态服务器 1.修改uwsgi配置文件>nginx反向代理[nginx接收请求->传递->[uwsgi] http=.. --& ...

  8. OD(lfdnb)

    由于一场意外,D死了,在此开一个新坑 2019.11.13 考前焦虑 智商为负 有点担心考试状态 2019.11.12 上午考试简直心态爆炸 T1看了一个小时不会 然后看T2,这时候wxy聚聚已经切了 ...

  9. Codeforces Round 561(Div 2)题解

    这是一场失败的比赛. 前三题应该是随便搞的. D有点想法,一直死磕D,一直WA.(赛后发现少减了个1……) 看E那么多人过了,猜了个结论交了真过了. 感觉这次升的不光彩……还是等GR3掉了洗掉这次把, ...

  10. DOM操作 三大家族

    clientHeight     获取对象的高度,不计算任何边距.边框.滚动条,但包括该对象的补白.   clientLeft     获取    offsetLeft     属性和客户区域的实际左 ...