Spring中基于注解的IOC(一):基础介绍
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(一):基础介绍的更多相关文章
- Spring中基于注解的IOC(二):案例与总结
2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- 10 Spring框架--基于注解的IOC配置
1.工程环境搭建 2.基于注解的IOC配置 IOC注解的分类 (1)用于创建对象的 他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的@Component: 作用: ...
- spring的基于注解的IOC配置
1.配置文件配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http: ...
- spring中基于注解使用AOP
本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...
- spring中基于注解使用ehcache
继续上篇,这篇介绍服务层缓存,基于注解的方式使用ehcache 注解的标签主要有4个:@Cacheable.@CacheEvict.@CachePut.@Caching,他们的用法是: @Cachea ...
- Spring中基于注解方式管理bean
操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...
- spring基于注解的IoC以及IoC的案例
1.Spring中IoC的常用注解 1.1明确: (1)基于注解的配置和xml的配置要实现的功能都是一样的,都是要降低程序之间的耦合,只是配置的形式不一样 2.案例:使用xml方式和注解方式实现单表的 ...
- Spring 中基于 AOP 的 @AspectJ注解实例
@AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格.通过在你的基于架构的 XML 配置文件中包含以下元素,@AspectJ 支持是可用的 ...
随机推荐
- mobx 学习笔记
Mobx 笔记 Mobx 三板斧,observable.observer.action. observable: 通过 observable(state) 定义组件的状态,包装后的状态是一个可观察数据 ...
- Pandas | 08 重建索引
重新索引会更改DataFrame的行标签和列标签. 可以通过索引来实现多个操作: 重新排序现有数据以匹配一组新的标签. 在没有标签数据的标签位置插入缺失值(NA)标记. import pandas a ...
- [RN] React Native 获取验证码 按钮
React Native 获取验证码 按钮 效果如图: 实现方法: 一.获取验证码 按钮组件 封装 CountDownButton.js "use strict"; import ...
- C#中的Queue集合
Queue<T>集合 特点:先进先出,简单来说,就是新添加的元素是顺序添加在集合尾部,但是,移除的时候是从顶部开始移除元素. 三个方法: Enqueue(T obj);//顺序添加一个值到 ...
- 【CF573E】Bear and Bowling
[CF573E]Bear and Bowling 题面 洛谷 题解 首先有一个贪心的结论: 我们一次加入每个数,对于\(\forall i\),位置\(i\)的贡献为\(V_i = k_i\times ...
- VueCli3新特性
升级VueCli3的理由: 1.构建速度大大加快,之前看到一个升级的例子是2的3倍速度,具体可以在自己迁移一个项 目测试下,这里的优化有默认开启了多核构建.缓存 并行和缓存 2.webpack被内置到 ...
- .net项目发布到iis
参考: https://www.cnblogs.com/teyigou/p/8125379.html https://www.cnblogs.com/kissfu/p/6399472.html htt ...
- 第02组 Alpha冲刺(2/6)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 任务分配.进度监督 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 还剩下哪些任务 ...
- 2018-2019-2 网络对抗技术 20165230 Exp9 :Web安全基础
目录 实验目的 实验内容 Webgoat前期准备 出现的问题 (一)SQL注入攻击 命令注入:Command Injection 数字型注入:Numeric SQL Injection 日志欺骗:Lo ...
- Linux上使用yum安装openjdk
来源:https://www.cnblogs.com/yaun1498078591/p/10368884.html 使用yum查找jdk: yum search java|grep jdk # yum ...