解析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 ...
随机推荐
- Django项目 BBS论坛
BBS论坛 一.项目表分析 二.自定义form组件 三.注册功能 四.BBS论坛 登录功能
- UVA11427 Expect the Expected 概率dp+全概率公式
题目传送门 题意:小明每晚都玩游戏,每一盘赢的概率都是p,如果第一盘就赢了,那么就去睡觉,第二天继续玩:否则继续玩,玩到赢的比例大于p才去睡:如果一直玩了n盘还没完成,就再也不玩了:问他玩游戏天数的期 ...
- UartAssist串口调试工具
第一步安装UartAssist 第二步打开UartAssist 界面为 我们将我们的wifi模块连接电脑, 查看的端口号通过计算机管理设备管理器进行查看 根据要求发送数据 就可以了
- 页面中iframe 弹层 和拖动效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Redis探索之路(六):Redis的常用命令
一:键值相关命令 1.keys Pattern模糊查询 keys my* 2.exists某个key是否存在 exists key1 3.del 删除一个key del key1 4.expire设置 ...
- 每天进步一点点-WPF-根据数据类型加载控件
目的,根据数据类型的不同,动态的加载适用于不同数据类型的控件(布局) 原理:为自定义的数据类型添加数据魔板,绑定的时候绑定这些数据类型的实例. 例子: 数据类型: 数据模板: <DataTemp ...
- leetcood学习笔记-203-移除链表元素
题目描述: 方法:#在改pre链表时 head中的值也改变 class Solution(object): def removeElements(self, head, val): "&qu ...
- scala中Trait简单使用
trait Log { def log(message:String) = println("log:" + message) } /** * 为实例混入trait * */ tr ...
- Java面向对象的特征一:封装性
1.4 面向对象的特征一:封装性 当创建了类的对象以后,如果直接通过"对象.属性"的方式对相应的对象属性赋值的话,可能会出现不满足实际情况的意外,我们考虑不让对象来直接作用属性,而 ...
- FreeMarker简单入门到使用
FreeMarker freemarker是一个用java开发的模版引擎,百度百科: 常用的java模版还有快要被抛弃的Jsp(熟悉).Thymeleaf(了解).Velocity(不知) freem ...