解析Spring第二天
目的:使用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第二天的更多相关文章
- [原理][来源解析]spring于@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关联
Spring 捆绑Hibernate. 夹: 一. 1. Spring 怎样处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSe ...
- Spring5源码解析-Spring框架中的单例和原型bean
Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...
- [原理][源代码解析]spring中@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关系---转载
问题: 一. 1. Spring 如何处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSession ? 3. propagati ...
- Spring第二天
Spring第二天 整体课程安排(3天+2天): 第一天:Spring框架入门.IoC控制反转的配置管理.Spring Web集成.Spring Junit集成. 第二天:Spring AOP面向切面 ...
- Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】
前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...
- 解析spring启动加载dubbo过程
一:简单配置 web.xml <context-param> <param-name>contextConfigLocation</param-name> < ...
- 全面解析Spring中@ModelAttribute注解的用法
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...
- 学习spring第二天
Spring第二天笔记 1. 使用注解配置Spring入门 1.1. 说在前面 学习基于注解的IoC配置,大家脑海里首先得有一个认知,即注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦 ...
- 《Spring源码深度解析》第二章 容器的基本实现
入门级别的spring配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&q ...
随机推荐
- SQL Server2012 Offset Fetch子句 分页查询
在本教程中,将学习如何使用SQL Server OFFSET FETCH子句来限制查询返回的行数.OFFSET和FETCH子句是ORDER BY子句的选项. 它们用于限制查询返回的行数.以下是OFFS ...
- Excel函数——ANSI字符集与Code、Char、Asc函数
小叙背景 Windows系统下,默认的字符集为ANSI,该字符编码方式在不同语言环境下采用不同的编码方案,在中文系统下ANSI编码是GBK.ANSI由ASCII扩展而来,ANSI下无论何种具体的编码方 ...
- ES6数组Api扩充
1. Array.of( ); ----将一组数据转换成一个数组: const num=201314; const a=Array.of(num); console.log(a); //数组 ...
- autocomplete调用接口数据实现
开发中遇到需要对大量数据实时搜索,频繁调取api产生的问题记录 1.每输入一个字符,就向后端发一次请求.当输入完一个人名的时候,就已经向后端发送了好多条请求,太多的请求会给服务器带来压力,其实在实时搜 ...
- 将Java和Javac的命令在控制台的输出重定向到txt文件
当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...
- ./vimrc代码解析全
""""""""""""""""&quo ...
- Tools: java安装指南
参考: https://www.cnblogs.com/smyhvae/p/3788534.htmljava安装 (1)新建->变量名"JAVA_HOME",变量值" ...
- map 结构体
map<node,int> 需要运算符重载< 请注意,不同的node,请务必让它们可以区分出来(node a,b a<b or b<a) 如 node { int a,i ...
- 【JZOJ3294】【BZOJ4417】【luoguP3990】超级跳马
description analysis 矩阵乘法好题 最朴素的\(10pts\)的\(f[i][j]\)容易\(DP\),但是是\(O(nm^2)\)的复杂度 于是把\(10\)分的\(DP\)写出 ...
- Python获取房价信息和导出EXCEL
房价与生活息息相关,那么各地区房价情况和差别咋样呢? 可以打开网站或手机APP去查询一下,不过查看到的数据有限,很不过瘾~ 作为一个合格的程序员,要懂得用代码解决问题! 第一步:打开一个房产交易平台 ...