目的:使用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. 51-Ubuntu-打包压缩-1-打包压缩简介

    打包压缩是日常工作中备份文件的一种方式 在不同操作系统中,常用的打包压缩方式是不同的 Windows 常用 rar Mac 常用 zip Linux 常用 tar.gz

  2. sanic连接mongo

    方法一: #没有密码,就是没有用户和用户密码 settings={"MOTOR_URI":"mongodb://127.0.0.1:27017/zzy"} ap ...

  3. python之pyquery 学习

    pyquery是jQuery的Python实现,可以用以解析HTML网页的内容.官网文档:http://pythonhosted.org/pyquery/ 下载:https://pypi.python ...

  4. java动态代理--proxy&cglib

    大纲 代理 proxy cglib 小结 一.代理 为什么要用代理?其实就是希望不修改对象的情况下,增强对象. 静态代理: 静态代理模式,需要代理类和目标类实现同一接口,代理类的方法调用目标类的方法, ...

  5. Magento获取当前页面URL地址

    Magento获取当前页面URL地址 http://www.sunhaibing.com/?p=1260 在Magento中,可以通过core/url助手类中的getCurrentUrl()方法获取当 ...

  6. spring5.02版快速入门

    spring5.02版快速入门分为以下 四步, 1. 引入依赖 2. 创建beans.xml配置文件 3 创建相应的接口实现类(仅仅是快速创建,实现类不给任何方法) 4. 创建容器对象,根据id获取对 ...

  7. Java中的线程Thread方法之---join()

    上一篇我们说到了Thread中的stop方法,这一篇我们再来看一下方法join的使用,那么方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. join方法从字面上的意 ...

  8. 牛客多校第九场 E All men are brothers 并查集/组合论

    题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...

  9. hdu多校第五场1007 (hdu6630) permutation 2 dp

    题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支. 设dp[n]为 ...

  10. easyUI tabs 显示与隐藏 tab 页

    隐藏: tab_option = $('#tabs').tabs('getTab'," 单位信息 ").panel('options').tab; tab_option.hide( ...