目的:使用spring中纯注解的方式

前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的Maven工程可以参考mybatis入门第一天的详解)。

bean管理类常用的4个注解(作用相同,推荐使用在不同分层上)

​ @Component 普通的类

@Controller 表现层

@Service 业务层

@Repository 持久层

依赖注入常用的注解

@Value 用于注入普通类型(String,int,double等类型)

@Autowired 默认按类型进行自动装配(引用类型)

​ @Qualifier 和@Autowired一起使用,强制使用名称注入

@Resource Java提供的注解,也被支持。使用name属性,按名称注入

对象生命周期(作用范围)注解

@Scope 生命周期注解,取值singleton(默认值,单实例)和prototype(多例)

以上具体的使用方式在以下的项目中在具体分析。

首先看一下,搭建项目的结构

  • 引入开发需要的坐标

  

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>zh.test.spring</groupId>
<artifactId>spring_day02</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.13</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
  • 在demo文件下分别添加接口UserService和UserDaoService并分别实现接口》》》UserServiceImpl和UserDaoImpl。如下

  创建UserDaoService接口。

 package zh.test.demo;

 //编写一个简单的保存方法
public interface UserDaoService {
public void save();
}

  实现UserDaoService接口,创建UserDaoImpl类

 package zh.test.demo;

 import org.springframework.stereotype.Repository;

 //在Dao(持久)层使用@Repository的注解方式,将这个类放到spring的IOC容器中
@Repository("UserDao")
public class UserDaoImpl implements UserDaoService {
public void save() {
System.out.println("持久层数据。。。");
}
}

  创建UserService接口,

 package zh.test.demo;

 public interface UserService {
public void save();
}

  实现UserService接口,创建UserServiceImpl。

 package zh.test.demo;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import javax.annotation.Resource;
import javax.naming.Name; //@Component
//public class UserServiceImpl
// 相当于
//<bean id="userServiceImpl" class="zh.test.demo.UserServiceImpl"></bean> //@Component("us")
//含义:把当前的类存放到IOC容器中,默认的ID值是首字母小写的类名。
// 如果属性是value,而且只写了一个属性,那么value是可以省略不写的
@Component("us")
public class UserServiceImpl implements UserService {
// @Value("lebron") 给属性注入值,在使用这种方式给属性注入值得时候,那么就不用提供set方法也是可以的
@Value("lebron")
private String name; // public void setName(String name) {
// this.name = name;
// } //@Autowired 按照类型注入 没有按照ID的方式注入(和ID没有关系)。
//@Qualifier(value = "UserDao") 注入的时候根据名字注入。和UserDaoImpl 上注入的名字要相同。
//如果使用@Resource(name = "UserDao") 这个方式注解,则这一个相当于上面那两个注解
// @Autowired
// @Qualifier(value = "UserDao") @Resource(name = "UserDao")
private UserDaoService userDaoService; public void setUserDaoService(UserDaoService userDaoService) {
this.userDaoService = userDaoService;
} public void save() {
userDaoService.save();
System.out.println("注解的方式。。。"+name);
}
}
  • 在demo1的文件下使用纯注解的方式

  创建DeptService接口  

 package zh.test.demo1;

 public interface DeptService {
public void find();
}

  实现接口DeptService,创建类DeptServiceImpl

 package zh.test.demo1;

 import org.springframework.stereotype.Service;

 @Service("deptService")
public class DeptServiceImpl implements DeptService {
public void find() {
System.out.println("service.....");
}
}

  新建一个Java类为AnnotationProperties,当做配置文件使用,使用方式如下

 package zh.test.demo1;

 import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration //声明当前类是配置类
@ComponentScan(value = "zh.test.demo1") //指定扫描的包
public class AnnotationProperties { // @Bean注解 只能写在方法上,表明使用此方法创建一个对象,对象创建完成保存到IOC容器中
/*
<!--配置bean的标签-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/xxx" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
*/
@Bean(name = "dataSource")
public DataSource dataSource()
{
DruidDataSource datasource=new DruidDataSource();
datasource.setDriverClassName("com.alibaba.druid.pool.DruidDataSource");
return datasource;
}
}
  • 在resources文件下创建一个applicationContext.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:util="http://www.springframework.org/schema/util"
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/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解扫描,扫描包下的所有的类,看哪个类上有注解,把类放到IOC容器中-->
<!--<bean id="userService" class="zh.test.demo"></bean>-->
<!---->
<context:component-scan base-package="zh.test"/> </beans>
  • 测试程序

  创建一个junitdemo的Java类来测试

 package zh.test.demo;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import javax.annotation.Resource;
import javax.naming.Name; //@Component
//public class UserServiceImpl
// 相当于
//<bean id="userServiceImpl" class="zh.test.demo.UserServiceImpl"></bean> //@Component("us")
//含义:把当前的类存放到IOC容器中,默认的ID值是首字母小写的类名。
// 如果属性是value,而且只写了一个属性,那么value是可以省略不写的 //@Scope(value = "singleton") 默认是单例的,如果改成是多例的则换成prototype
@Component("us")
@Scope(value = "singleton")
public class UserServiceImpl implements UserService {
// @Value("lebron") 给属性注入值,在使用这种方式给属性注入值得时候,那么就不用提供set方法也是可以的
@Value("lebron")
private String name; // public void setName(String name) {
// this.name = name;
// } //@Autowired 按照类型注入 没有按照ID的方式注入(和ID没有关系)。
//@Qualifier(value = "UserDao") 注入的时候根据名字注入。和UserDaoImpl 上注入的名字要相同。
//如果使用@Resource(name = "UserDao") 这个方式注解,则这一个相当于上面那两个注解
// @Autowired
// @Qualifier(value = "UserDao") @Resource(name = "UserDao")
private UserDaoService userDaoService; public void setUserDaoService(UserDaoService userDaoService) {
this.userDaoService = userDaoService;
} public void save() {
userDaoService.save();
System.out.println("注解的方式。。。"+name);
}
}

测试纯注解的方式,创建testdemo1.java 文件。

 package zh.test;

 import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import zh.test.demo1.AnnotationProperties;
import zh.test.demo1.DeptService; public class testdemo1 { @Test
public void test1()
{
//创建工厂,加载配置类文件。
AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(AnnotationProperties.class);
DeptService deptService = (DeptService) factory.getBean("deptService");
deptService.find();
}
}

分享之路,欢迎交流。。。

解析Spring第二天的更多相关文章

  1. [原理][来源解析]spring于@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关联

    Spring 捆绑Hibernate. 夹: 一.  1. Spring 怎样处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSe ...

  2. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

  3. [原理][源代码解析]spring中@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关系---转载

    问题: 一. 1. Spring 如何处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSession ? 3. propagati ...

  4. Spring第二天

    Spring第二天 整体课程安排(3天+2天): 第一天:Spring框架入门.IoC控制反转的配置管理.Spring Web集成.Spring Junit集成. 第二天:Spring AOP面向切面 ...

  5. Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

    前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...

  6. 解析spring启动加载dubbo过程

    一:简单配置 web.xml <context-param> <param-name>contextConfigLocation</param-name> < ...

  7. 全面解析Spring中@ModelAttribute注解的用法

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...

  8. 学习spring第二天

    Spring第二天笔记 1. 使用注解配置Spring入门 1.1. 说在前面 学习基于注解的IoC配置,大家脑海里首先得有一个认知,即注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦 ...

  9. 《Spring源码深度解析》第二章 容器的基本实现

    入门级别的spring配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&q ...

随机推荐

  1. Python 变量作用域 LEGB (下)—— Enclosing function locals

    上篇:Python 变量作用域 LEGB (上)—— Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...

  2. js模块化的历史

    了解模块化开发的历史,可以帮助我们理解 模块化开发的形式是怎么样的,对我们深入学习模块化开发会有很大的帮助: 一.服务器端JS的模块化 nodeJS的出现   ------官网: http://nod ...

  3. Codeforces Round #535 F-MST Unification

    题目大意: 给定n m 为图中的点数n和边数m 给定m条边的信息 u v w 为u点到v点有一条长度为w的边 图中无环无重边 这个图的MST的花费为k 但可能存在多种花费为k的MST的方案 此时对图中 ...

  4. 关于hadoop多次format之后,会出现的dataNode消失问题

    如标题,最近我由于想初始化以下hadoop集群,之后却发现启动集群后所有的DataNode都消失了. 问题查找: 由于时所有的DataNode都出了问题,于是我翻找了以下DataNode的日志(默认在 ...

  5. struts2注解返回json

    Struts2使用注解方式返回Json数据 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Geek_Alex/article/details/788 ...

  6. UDP部分

    IP地址:互联网协议地址,计算机的通行证.计算机在网络中的唯一身份标识.桥接:Ubuntu虚拟机 直接连到局域网NAT:网络地址转换点分十进制:192.168.14.115IP地址通常为4个字节,简称 ...

  7. vim 详解

    Vim是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最常用的文本编辑器. 它的作用是建立.编辑.显示文本文件. Vim的几种模式 正常模式: 可以使用快捷键命令,或按:输入命令行. 插入模 ...

  8. delphi Copy函数 和 Pos函数

    copy(a,b,c); a:就是copy源,就是一个字符串,表示你将要从a里copy一些东西, b:从a中的第b位开始copy(包含第1位), c:copy从第b位开始后的c个字符, 例如: m:= ...

  9. sublime上插件的安装与使用

    1.插件安装的方式 插件安装方式一:直接安装 下载插件安装包后,把安装包解压到packages目录(菜单->首选项->浏览插件目录)中,完成安装 插件安装方法二:使用package con ...

  10. 回滚树形dp(按dfs序dp)——hdu6035

    本题前面的操作别的博客里都有.难点在于颜色ci的贡献,如何一次dfs求出答案 先来考虑如何在一次dfs中单独对颜色i进行计算 用遍历dfs序的方式,在深搜过程中,碰到带有颜色 i 的点 u,u每个颜色 ...