这里的注解是最初级的一些注解,掌握了之后再学习其它的注解

注解扫描

<?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 https://www.springframework.org/schema/context/spring-context.xsd"> <!--此标签表示开启注解扫描,即扫描对应包及其子包的注解-->
<context:component-scan base-package="com.ty"></context:component-scan>
</beans>

除了上述方式还可以指定过滤规则来进行注解扫描

<context:component-scan base-package="com.ty">
<!--排除过滤,排除包中的某些类
type="":指定过滤规则
annotation:按照注解进行排除,标注了指定注解的组件不要,expression表示要过滤的注解
assignable:指定排除某个具体的类,按照类排除,expression表示不注册的具体类名
aspectj:后面讲aop的时候说明要使用的aspectj表达式,不用
custom:定义一个typeFilter,自己写代码决定哪些类被过滤掉,不用
regex:使用正则表达式过滤,不用
-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--包含过滤,指定包中的类
需要先配置use-default-filters属性,让默认扫描方式失效,默认是扫描全部
剩下的过滤属性跟排除过滤相同
-->
<context:component-scan base-package="com.ty" use-default-filters="false">
<context:include-filter type="aspectj" expression="com.ty.other.*"/>
</context:component-scan>

创建对象

@Component

此注解就是原配置方式中的<bean>标签,即:<bean id="user" class="com.ty.bean.User">

注解中组件的id默认是类名首字母小写,class就是底层通过反射获取User类信息;通过@Component分别又衍生出三个注解

注解 含义、说明
@Component 没有明显含义
@Controller 控制器,推荐给controller层添加此注解
@Service 业务逻辑,推荐给业务逻辑层添加此注解
@Repository 数据库管理,推荐给数据访问层添加此注解

这4个注解产生的效果方式是相同的,只是为了方便阅读,提高可读性

@Component
public class User {
private String username;
private String password; /*省略构造,getter/setter和toString方法 */
}

@Scope

设置bean对象的作用域,就是bean标签中的scope属性

@Lazy

延迟创建单实例对象,就是bean标签中的lazy="false"属性

@PostConstruct

@PreDestroy

这两个注解表示bean对象的对象的生命周期,就是bean标签中的init-method和destroy-method属性

@PostConstruct
public void init() {
System.out.println("init");
} @PreDestroy
public void destroy() {
System.out.println("destroy");
}

依赖注入

@Autowired

@Repository
public class UserDaoImpl implements UserDao {
@Override
public void findUser() {
System.out.println("查询用户!");
}
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao; @Override
public void login() {
userDao.findUser();
}
}

注意:此注解默认是按照类型进行自动装配(就是注入)

1、如果只找到一个,则直接进行赋值,

2、如果没有找到,则直接抛出异常,

3、如果找到多个,那么会按照变量名作为id继续匹配,

  • 匹配上直接进行装配

  • 如果匹配不上则直接报异常

@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao2; @Override
public void login() {
userDao2.findUser();
}
} //UserServiceImpl2继承UserServiceImpl类
@Service
public class UserServiceImpl2 extends UserServiceImpl {
@Autowired
private UserDao userDao; @Override
public void login() {
System.out.println("UserServiceImpl2");
userDao.findUser();
}
}
@Controller
public class UserController {
@Autowired
private UserService userServiceImpl; public void test() {
userServiceImpl.login();
}
}

方法上也可以有@Autowired注解

@Autowired
public void setUserService(UserService userServiceImpl) {
this.userService = userServiceImpl;
}

@Qualifier

此注解配套@Autowired使用,用来指定id的名字,让其按照名字装配;按照名字找到了就进行装配,否则就报错

@Controller
public class UserController {
@Autowired
@Qualifier("userServiceImpl")
private UserService userService; public void test() {
userService.login();
}
}

@Autowired注解可以用在方法上,@Qualifier只可以用在参数列表中

@Autowired
public void test(@Qualifier("userServiceImpl2") UserService userService) {
System.out.println("此方法被调用:" + userService);
}

ps:方法上有@AutoWired注解时:bean创建时会自动调用,这个方法的每个参数都会自动注入

​ @Qualifier注解作用在参数上时,指定属性的id名字

@Resource

@Resource注解的作用和@Autowired的作用相同,而且@Resource(name="") = @Autowired+@Resource

public class UserController {
@Resource(name = "userServiceImpl")
private UserService userService;
} 等同于:
public class UserController {
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;
}

两者的功能相同,但还是有区别的:

@Autowired注解是Spring提供的,而@Resource是JavaEE规范提供的

​@Autowired注解默认按照类型装配,而@Resource注解默认是按照名字装配

@Value

属性赋值,这种方式不能用在静态变量上,而且不能注入集合类型

#先定义一个properties属性文件,并设置要注入属性的值
username=jack
password=root
<!--把刚刚定义好的properties属性文件加载到配置文件中-->
<context:property-placeholder location="classpath:bean.properties"></context:property-placeholder> 或者在类上添加@PropertySource("bean.properties")注解
//在属性上加 @Value("${key}") 注解
@Value("${username}")
private String username;
@Value("${password}")
private String password;

最后再看一下泛型依赖

泛型依赖

public class Student {
} public class Teacher {
}
public interface BaseDao<T> {
void save();
} //StudentDao.java
@Repository
public class StudentDao implements BaseDao<Student> {
@Override
public void save() {
System.out.println("保存学生!");
}
} //TeacherDao.java
@Repository
public class TeacherDao implements BaseDao<Teacher> {
@Override
public void save() {
System.out.println("保存老师!");
}
}
public class BaseService<T> {
@Autowired
private BaseDao<T> baseDao; public void save(){
baseDao.save();
}
} //StudentService.java
@Service
public class StudentService extends BaseService<Student> {
} //TeacherService.java
@Service
public class TeacherService extends BaseService<Teacher> {
}
//测试
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
StudentService studentService = context.getBean("studentService", StudentService.class);
TeacherService teacherService = context.getBean("teacherService", TeacherService.class);
studentService.save();
teacherService.save();

Spring-IOC注解编程的更多相关文章

  1. spring IOC注解与xml配置

    转载自:https://blog.csdn.net/u014292162/article/details/52277756 IOC 1小案例 将对象的依赖交给配置文件来配置(配置文件的名字是可以任意的 ...

  2. spring IOC注解方式详解

    本文分为三个部分:概述.使用注解进行属性注入.使用注解进行Bean的自动定义. 一,概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以 ...

  3. spring ioc 注解配置

    要注意spring 版本与jdk的兼容性 applicationContext-resource.xml: <beans xmlns="http://www.springframewo ...

  4. spring IOC 注解@Required

    @Required注解适用于bean属性的setter方法,使用@Required的方法必须在xml中填充,负责报错 例如下面的例子中,student中的setAge和setName有@Require ...

  5. spring IOC 注解@Resource

    1.@Resource(重要)a)加入 :j2ee/common-annotations.jar b)默认按名称,名称找不到,按类型 默认按照名称setName1到xml中找和id相同的,没有的话再找 ...

  6. spring IOC 注解@Autowired

    自动装配:按照类型来找 会在xml中找类型一样的, 比如 setMessage(SetName setName)上面有@Autowired,会到xml中找<bean id="setna ...

  7. 理解 Spring 注解编程模型

    理解 Spring 注解编程模型 Spring 中有一个概念叫「元注解」(Meta-Annotation),通过元注解,实现注解的「派生性」,官方的说法是「Annotation Hierarchy」. ...

  8. Spring _day02_IoC注解开发入门

    1.Spring IoC注解开发入门 1.1 注解开发案例: 创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包 ...

  9. 案例学编程系列:案例认识 Spring IOC

    本文spring libs 地址:https://github.com/yizhiamumu/springlibs Spring 能帮我们做什么 ①.Spring 能帮我们根据配置文件创建及组装对象之 ...

  10. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...

随机推荐

  1. 使用github actions 完成一些自动化工作

    github actions 是什么? github actions是github的持续集成及自动化工作流服务,使用起来都比较方便.大部分github actions都可以在https://githu ...

  2. SQL优化之SELECT COUNT(*)

    前言 SQL优化之SQL 进阶技巧(上) SQL优化之SQL 进阶技巧(下)中提到使用以下 sql 会导致慢查询 SELECT COUNT(*) FROM SomeTable SELECT COUNT ...

  3. IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

  4. PyQt学习随笔:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可见行、逻辑行、可见列、逻辑列)相关概念及方法探究

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概念 关于逻辑行logicalRow.列logicalColumn和可见行visualRow.列 ...

  5. 使用PyQt(Python+Qt)+动态编译36行代码实现的计算器

    PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于 ...

  6. 【Docker】 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  7. 刷题记录:[GWCTF 2019]枯燥的抽奖

    目录 刷题记录:[GWCTF 2019]枯燥的抽奖 知识点 php伪随机性 刷题记录:[GWCTF 2019]枯燥的抽奖 题目复现链接:https://buuoj.cn/challenges 参考链接 ...

  8. 写了一个类似与豆瓣的电影的flask小demo

    先展示页面 基本的功能是都已经实现了,更多那个地方是可以点的.只不过视频上面还用的宏,哎呀,感觉麻烦.有多麻烦呢,需要先定义一个宏,然后进行引用.我们才能是用,以我的观点,还不如直接是一个循环完事.. ...

  9. 学习JUC源码(1)——AQS同步队列(源码分析结合图文理解)

    前言 最近结合书籍<Java并发编程艺术>一直在看AQS的源码,发现AQS核心就是:利用内置的FIFO双向队列结构来实现线程排队获取int变量的同步状态,以此奠定了很多并发包中大部分实现基 ...

  10. LeetCode初级算法之数组:136 只出现一次的元素

    只出现一次的元素 题目地址:https://leetcode-cn.com/problems/single-number/ 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找 ...