本篇文章继续上篇文章讲解Ioc基础,这篇文章主要介绍使用spring注解配置Ioc

上篇文章主要是通过xml配置文件进行Ioc的配置。这次进行改造下,通过注解进行配置

首先先看一个简单的demo

简单demo

  • 构建maven项目
  • pom文件如下
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.0.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
</dependencies>
  • BookDao.java
package com.kevin.spring.demo1.dao;

/**
* 书籍dao
*/
public interface BookDao { /**
* 添加图书
* @param book
* @return
*/
String addBook(String book);
}
  • BookDaoImpl.java
package com.kevin.spring.demo1.dao.impl;

import com.kevin.spring.demo1.dao.BookDao;
import org.springframework.stereotype.Component; /**
* 图书实现类
*/
@Component(value = "book")
public class BookDaoImpl implements BookDao {
public String addBook(String book) {
return "添加图书" + book + "成功";
}
}

在类的开头使用了@Component注解,它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。id 为 book。注意这里我指定了value值

  • book.xml
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.kevin.spring.demo1"></context:component-scan>
</beans>

这里 增加了注解扫描的范围,指定了demo1包

  • 测试业务类
package com.kevin.spring.demo1.service;

import com.kevin.spring.demo1.dao.impl.BookDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* 业务类
*/
public class BookService {
private BookDaoImpl bookDao; public void addBook(String bookName) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("book.xml");
bookDao = ctx.getBean("book", BookDaoImpl.class);
String resout = bookDao.addBook(bookName);
System.out.println(resout);
} public static void main(String[] args) {
new BookService().addBook("JAVA");
}
}

运行结果

信息: Loading XML bean definitions from class path resource [book.xml]
添加图书JAVA成功

我们已经完成一个简单的demo,当然只学习这些是不够的,我们还要继续挖掘每个细节

@Component注解

上面的demo中我们指定了一个value值,如果不指定value值的话,他默认是什么呢?

修改BookDaoImpl.java文件,将value值删除

/**
* 图书实现类
*/
@Component
public class BookDaoImpl implements BookDao {
public String addBook(String book) {
return "添加图书" + book + "成功";
}
}

修改测试类

package com.kevin.spring.demo1.service;

import com.kevin.spring.demo1.dao.impl.BookDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* 业务类
*/
public class BookService {
private BookDaoImpl bookDao; public void addBook(String bookName) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("book.xml");
bookDao = ctx.getBean("bookDaoImpl", BookDaoImpl.class);
String resout = bookDao.addBook(bookName);
System.out.println(resout);
} public static void main(String[] args) {
new BookService().addBook("JAVA");
}
}

注意下,getBean()方法部分

运行结果

信息: Loading XML bean definitions from class path resource [book.xml]
添加图书JAVA成功

结果证明,如果没有写value的话,默认是该类名字且首字母小写

xml配置文件

    <context:component-scan base-package="com.kevin.spring.demo1" resource-pattern="">
<context:exclude-filter type="" expression=""></context:exclude-filter>
<context:include-filter type="" expression=""></context:include-filter>
</context:component-scan>

如上面代码所示

  • resource-pattern:对指定的基包下面的子包进行选取
  • include-filter:指定需要包含的包
  • exclude-filter:指定需要排除的包
    • expression:表示过滤的表达式
    • type :表示采的过滤类型 共5种类型(如下所示)
Filter Type Examples Expression Description
annotation org.example.SomeAnnotation 注解了SomeAnnotation的类
assignable org.example.SomeClass 所有扩展或者实现SomeClass的类
aspectj org.example..*Service+ AspectJ语法表示org.example包下所有包含Service的类及其子类
regex org.example.Default.* Regelar Expression,正则表达式
custom org.example.MyTypeFilter 通过代码过滤,实现org.springframework.core.type.TypeFilter接口

作用域scope

上篇文章,我们知道在xml中bean中可以配置scope 且默认为singletion,我们看看采用注解的时候是不是默认也是singleton

修改代码

public class BookService {
private BookDaoImpl bookDao;
private BookDaoImpl bookDao1; public void addBook(String bookName) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("book.xml");
bookDao = ctx.getBean("bookDaoImpl", BookDaoImpl.class);
bookDao1 = ctx.getBean("bookDaoImpl", BookDaoImpl.class);
System.out.println(bookDao == bookDao1);
String resout = bookDao.addBook(bookName);
System.out.println(resout);
} public static void main(String[] args) {
new BookService().addBook("JAVA");
}
}

运行结果

true
添加图书JAVA成功

如果我想要修改scope 怎么弄呢?

可以增加@Scope(value ="prototype" ),增加后运行结果为false

Lazy延迟初始化Bean

xml中可以设置延迟加载bean,当然注解也有

@Lazy

初始化回调注解

@PostConstruct 初始化方法的注解方式 等同与在XML中声明init-method=init

销毁回调

@PreDestroy 销毁方法的注解方式 等同于在XML中声明destory-method=destory

自动装配

上面的代码中,我们都用了ApplicationContext初始化容器后获得需要的Bean,可以通过自动装配简化

package com.kevin.spring.demo1.service;

import com.kevin.spring.demo1.dao.impl.BookDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service; import javax.annotation.Resource; /**
* 业务类
*/
@Service
public class BookService {
@Resource
private BookDaoImpl bookDao;
@Resource
private BookDaoImpl bookDao1; public void addBook(String bookName) {
// ApplicationContext ctx = new ClassPathXmlApplicationContext("book.xml");
// bookDao = ctx.getBean("bookDaoImpl", BookDaoImpl.class);
// bookDao1 = ctx.getBean("bookDaoImpl", BookDaoImpl.class);
System.out.println(bookDao == bookDao1);
String resout = bookDao.addBook(bookName);
System.out.println(resout);
} public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("book.xml");
BookService bookService = ctx.getBean(BookService.class);
bookService.addBook("好好学习");
} }
  • @Service用于注解业务层组件

  • @Controller用于注解控制层组件

  • @Repository用于注解数据访问组件,即DAO组件

  • @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行注解。

装配注解主要有:@Autowired@Qualifie@Resource,它们的特点是:

  • @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

  • @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

  • @Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;如果Maven项目是1.5的JRE则需换成更高版本的。

  • @Resource@Autowired都可以书写注解在字段或者该字段的setter方法之上

好了,这篇文章就暂时写到这,大家玩的开心。

代码:https://github.com/runzhenghengbin/spring-study

参考:https://www.cnblogs.com/best/p/5727935.html#_label3

spring学习总结(一)_Ioc基础(中)的更多相关文章

  1. spring学习总结(一)_Ioc基础(下)

    本篇文章继续上篇文章讲解Ioc基础,这篇文章主要介绍零配置实现ioc,现在相信大家项目中也基本都是没有了xml配置文件.废话不多说.一起学习 代码示例 BookDao.java package com ...

  2. spring学习总结(一)_Ioc基础(上)

    最近经历了许许多多的事情,学习荒废了很久.自己的目标成了摆设.现在要奋起直追了.最近发现了张果的博客.应该是一个教师.看了他写的spring系列的博客,写的不错.于是本文的内容参考自他的博客,当然都是 ...

  3. Spring学习笔记一:基础概念

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774310.html    一:Spring是什么 Spring的主要作用是作为对象的容器. 传统编程中,我们 ...

  4. 【Spring学习】【Java基础回顾-数据类型】

    Java基础回顾过程中,之前对于Java相关基础知识都是从这个人的博客看一些,那边的内容看一下,觉得不够系统化,决定用xmind脑图的形式,将Java基础知识回顾的作为一个系列,当前正在做的会包含: ...

  5. 1.4(Spring学习笔记)Spring-JDBC基础

    一.Spring JDBC相关类 1.1 DriverManagerDataSource DriverManagerDataSource主要包含数据库连接地址,用户名,密码. 属性及含义如下配置所示: ...

  6. Spring学习(一)idea中创建第一个Spring项目

    1.前言 Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container). Sprin ...

  7. 我的Spring学习记录(五)

    在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...

  8. 不错的Spring学习笔记(转)

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  9. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

随机推荐

  1. java程序应为CRT登录时启动未设置编码,造成启动乱码

    1.以下提供CRT连接程序设置编码脚本,后缀为“.vbs” # $language = "VBScript"# $interface = "1.0" Sub M ...

  2. 为什么学习Lua

    目前公认的最快的脚本语言 可以编译调试 与C/C++结合容易 Lua是对性能有要求的必备脚本 C++的缺点: 编译慢,调试难 学习难度大

  3. SpringBoot实战(十四)之整合KafKa

    本人今天上午参考了不少博文,发现不少博文不是特别好,不是因为依赖冲突问题就是因为版本问题. 于是我结合相关的博文和案例,自己改写了下并参考了下,于是就有了这篇文章.希望能够给大家帮助,少走一些弯路. ...

  4. 深入浅出的webpack构建工具---tree shaking打包性能优化(十二)

    阅读目录 1. 什么是tree-shaking? 2. 在webpack中如何使用 tree-shaking 呢? 3. 使用webpack-deep-scope-plugin 优化 回到顶部 1. ...

  5. PAT A1137 Final Grading (25 分)——排序

    For a student taking the online course "Data Structures" on China University MOOC (http:// ...

  6. AI 判别式模型和生成式模型

    判别式模型(discriminative model) 生成式模型(generative model) 对于输入x,类别标签y:产生式模型估计它们的联合概率分布P(x,y)判别式模型估计条件概率分布P ...

  7. Android 百度sdk5.0定位

    在开发中可能 会用到诸如“定位出当前所在城市,所在位置的经纬度”等功能.一次性的定位肯能定位不成功,可能经纬度未读出来,也可能是地址信息或者城市信息未读出来.此时就需对定位后拿到的信息做判断,加入没有 ...

  8. 车轮升级PHP7踩过的一些坑

    社区php7升级记录 社区服务器已经全部完成升级,这里记录一下社区升级php7所遇到的问题,可以分为四个类型 扩展支持的变化,导致需要修改配置甚至调整替换操作的类库 php7语法检查比之前变得严格,部 ...

  9. ASP.NET MVC学习笔记(一) 从路由开始创建mvc

    之前一篇写一半发现版本太老了,是基于mvc2的. 两本参考书编写的顺序各方面都不太一样.决定重新写一篇. 我这篇文章基于mvc5,vs2015 参考书:Will保哥的ASP.NET MVC4开发指南 ...

  10. Maven私有仓库: 发布release版本报错:Return code is: 400, ReasonPhrase: Repository does not allow upd ating assets: maven-releases.

    今天在将一个maven组件由SNAPSHORT升级为正式版本1.0.0,然后执行发布: mvn clean deploy -pl ielong-common -am -DskipTests, 报错:R ...