目的:使用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. 净心诀---python3生成器

    生成器的作用----减少程序运行的内存开销 生成器特点: 1.一个一个的取值,而不是一次性把所有数据创建出来,迭代器中的数据不取不创建2.只能按照顺序取,不能跳过也不能回头3.一个迭代器中的数据只能从 ...

  2. Spring对junit的整合

    Spring对junit的整合 package cn.mepu.service; import cn.mepu.config.SpringConfiguration; import cn.mepu.d ...

  3. OAuth2.0实例说明

    OAuth2.0 详细实列+Word文档清晰说明 实例下载地址:https://files.cnblogs.com/files/liyanbofly/OAuth2.0%E5%AE%9E%E4%BE%8 ...

  4. sqlldr details

    https://www.csee.umbc.edu/portal/help/oracle8/server.815/a67792/ch05.htm Loading into Empty and Non- ...

  5. echarts图表自适应,容器宽度设置为百分比,但是图表显示不全,缩到一起

    <div  id="chartContainer" style="height:100%;width:100%;"></div> cha ...

  6. jq-demo-放大镜

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 使用vue-cli 脚手架快速搭建单页面组件 -------webpack工具的介绍

    在使用vue-cli时我们先了解一下什么是webpack. Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按 ...

  8. 【安装】Mac rabbitMQ

    安装 brew install rabbitmq 目录  cd /usr/local/Cellar/rabbitmq/3.7.4/sbin 插件 sudo ./rabbitmq-plugins ena ...

  9. 【NIO】NIO之浅谈内存映射文件原理与DirectMemory

    Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原 ...

  10. thinkphp 模型调试

    调试执行的SQL语句 在模型操作中 ,为了更好的查明错误,经常需要查看下最近使用的SQL语句,我们可以用getLastsql方法来输出上次执行的sql语句.例如: $User = M("Us ...