解析Spring第一天
目的:了解spring框架中的注解
前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的Maven工程可以参考mybatis入门第一天的详解)。
项目结构:

代码编辑:
在项目中引入需要的Maven开发坐标
<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>
</dependencies>
- 在demo文件下 编写接口UserService
package zh.test.deomo;
public interface UserService {
public void sayHi();
}
- 实现接口,编写UserServiceImpl
package zh.test.deomo;
public class UserServiceImpl implements UserService {
public void sayHi() {
System.out.println("SayHi");
}
}
- 载demo1文件下,编写关于spring使用setter的方式注入
创建一个DeptDao的接口
package zh.test.deomo1;
public interface DeptDao {
public void save();
}
实现该接口,DeptDaoImpl
package zh.test.deomo1;
public class DeptDaoImpl implements DeptDao {
public void save() {
System.out.println("持久层。。保存。。。");
}
}
编写DeptService的接口
package zh.test.deomo1;
public interface DeptService {
public void save();
}
实现接口DeptServiceImpl
package zh.test.deomo1;
public class DeptServiceImpl implements DeptService {
private DeptDao deptDao;
//普通的数据类型,也需要提供set的方法注入
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
//依赖注入通过set的方法传递进来
public void setDeptDao(DeptDao deptDao) {
System.out.println("set被调用。。。");
this.deptDao = deptDao;
}
public void save() {
System.out.println("业务层。。。保存");
System.out.println(name+":"+age);
deptDao.save();
}
}
- 在deomo2的文件下编写关于使用构造函数的方式注入Car.java文件
package zh.test.deomo2;
public class Car {
private String name;
private Double money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", money=" + money +
'}';
}
public Car(String name, Double money) {
this.name = name;
this.money = money;
}
}
- 在deomo4文件下编写扩展的类,主要是存放集合、数组、属性文件
package zh.test.deomo4; import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties; public class Extension {
//数组
private String [] strs; //集合
private List<String> list; //map
private Map<String,String> map; //属性文件
private Properties properties; @Override
public String toString() {
return "Extension{" +
"strs=" + Arrays.toString(strs) +
", list=" + list +
", map=" + map +
", properties=" + properties +
'}';
} public String[] getStrs() {
return strs;
} public void setStrs(String[] strs) {
this.strs = strs;
} public List<String> getList() {
return list;
} public void setList(List<String> list) {
this.list = list;
} public Map<String, String> getMap() {
return map;
} public void setMap(Map<String, String> map) {
this.map = map;
} public Properties getProperties() {
return properties;
} public void setProperties(Properties properties) {
this.properties = properties;
}
}
- 编写applicationContxt.xml文件在resources目录下
<?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"
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"> <!--IOC管理bean-->
<!--配置实现类,配置组建bean管理-->
<!--
标签bean 用来管理类,把类交给IOC容器管理,IOC容器把当前的这个类创建对象,存入到IOC容器中。
id="唯一的值,自定义"
class="管理类的全路径,包名+类名 底层使用反射代码创建对象"
class.forName("zh.test.deomo.UserServiceImpl") scope="是创建之后的对象是单例的还是多例的" 默认是单例的
scope="singleton" 单例的
scope="prototype" 多例的
区别:如果是多例的在程序加载配置文件的时候不会立即创建一个对象,而是什么时候用到什么时候会用到。
如果是单例的则是在程序已加载的时候就会创建一个对象。只要IOC的容器存在那么单例的对象就一直存在。
-->
<bean id="userService" class="zh.test.deomo.UserServiceImpl" /> <!--通过set的方法注入-->
<bean id="deptService" class="zh.test.deomo1.DeptServiceImpl">
<!--依赖注入 name="service中的属性"-->
<property name="deptDao" ref="deptDao"/>
<!--给普通的属性注入值-->
<property name="name" value="白天黑天阴天"/>
<property name="age" value="20"/>
</bean>
<bean id="deptDao" class="zh.test.deomo1.DeptDaoImpl"></bean> <!--属性的构造方法-->
<bean id="car" class="zh.test.deomo2.Car">
<constructor-arg name="name" value="劳斯劳斯"/>
<constructor-arg name="money" value="11111"/>
</bean> <!--扩展方法-->
<bean id="extension" class="zh.test.deomo4.Extension">
<!--数组-->
<property name="strs">
<array>
<value>l</value>
<value>g</value>
</array>
</property> <!--集合-->
<property name="list">
<list>
<value>james</value>
<value>davis</value>
</list>
</property> <!--map-->
<property name="map">
<map>
<entry key="lakers" value="lebron"/>
<entry key="lakers1" value="davis"/>
</map>
</property> <!--属性文件-->
<property name="properties">
<props>
<prop key="lakers">london</prop>
<prop key="lakers1">kuzma</prop>
</props>
</property>
</bean>
</beans>
- 最后写一个测试的方法,对以上的注入进行测试
package zh.test; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import zh.test.deomo.UserService;
import zh.test.deomo.UserServiceImpl;
import zh.test.deomo1.DeptService;
import zh.test.deomo2.Car;
import zh.test.deomo4.Extension; public class testDemo {
@Test
public void test()
{
//原始写法:
UserServiceImpl userService = new UserServiceImpl();
userService.sayHi();
//使用Spring框架 } @Test
public void testSpring(){
//创建SpringIOC的工厂(容器) ,需要加载配置文件,就会将配置文件中的类通过反射的方式创建成对象
//将对象存入到容器中,以key : value 的方式,k="userService" v="UserServiceImpl对象(默认是单例的)"
//
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象 面向接口的编程
UserService userService = (UserService) ac.getBean("userService");
//调用对象
userService.sayHi();
} // setter的方式注入
@Test
public void testSpringDI(){
//创建SpringIOC的工厂(容器) ,需要加载配置文件,就会将配置文件中的类通过反射的方式创建成对象
//将对象存入到容器中,以key : value 的方式,k="userService" v="UserServiceImpl对象(默认是单例的)"
//
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象 面向接口的编程
DeptService deptService = (DeptService) ac.getBean("deptService");
//调用对象
deptService.save();
} // 属性的构造方法注入
@Test
public void testCar(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象 面向接口的编程
Car car = (Car) ac.getBean("car");
//调用对象
System.out.println(car);
} //扩展方法 数组、集合、map、属性文件
@Test
public void testExtension(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象 面向接口的编程
Extension extension = (Extension) ac.getBean("extension");
//调用对象
System.out.println(extension);
} }
分享之路,欢迎交流。。。
解析Spring第一天的更多相关文章
- spring 第一篇(1-1):让java开发变得更简单(下)转
spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...
- 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于@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关联
Spring 捆绑Hibernate. 夹: 一. 1. Spring 怎样处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSe ...
- spring第一章
spring第一章 一.概述 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的 ...
- 解析spring启动加载dubbo过程
一:简单配置 web.xml <context-param> <param-name>contextConfigLocation</param-name> < ...
- 全面解析Spring中@ModelAttribute注解的用法
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...
- 学习spring第一天
Spring第一天笔记 1. 说在前面 怎样的架构的程序,我们认为是一个优秀的架构? 我们考虑的标准:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:就是可以做到,不断的增加代码,但是可以 ...
- Spring第一课:IOC控制反转,什么是反转,什么又是控制?
前言 学习Spring第一课,就是认识IOC控制反转,要了解它还真得花一些功夫.今天主要理解透彻它的真谛,而不仅限于表面. 上道小菜 public class BusinessService { pr ...
随机推荐
- 从零起步 系统入门Python爬虫工程师✍✍✍
从零起步 系统入门Python爬虫工程师 爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 原则上,只要是浏览器(客户端) ...
- Asia Hong Kong Regional Contest 2019
A. Axis of Symmetry B. Binary Tree n 的奇偶性决定胜负. C. Constructing Ranches 路径上点权之和大于,极大值两倍,这是路径上点能拼出多边形的 ...
- XVIII Open Cup named after E.V. Pankratiev. GP of SPb
contest Link A. Base i − 1 Notation solved by sdcgvhgj 238 求出a+b的2进制后从低位到高两位两位地转化为i-1进制 i-1进制的第2k位和第 ...
- sanic之websocket路由
在某些时候,需要建立websocket路由,来建立长链接,来实时传输数据,就比如一些聊天应用,就有实时音视频,需要实时传出状态 在sanic框架中支持两种websocket路由方式,有一种是再app中 ...
- JS的面向对象与原型
原型 const yoshi = { skulk: true }; const hattori = { sneak: true }; const kuma = { creep: true }; ⇽-- ...
- 提供免费可商用的优秀背景视频素材——COVERR
现在经常看到很多网站都是贴近更现代化的设计,首页都会放置跟网站内容相关的视频短片作为背景,不用按下播放按钮,就有动态显示效果,跟以往静态图片相较下更动态.更有活力,对网站的视觉体验有一定的提升作用.但 ...
- VS2012在win7 64位机中x86和x64下基本类型的占用空间大小(转)
VS2012在win7 64位机中x86和x64下基本类型的占用空间大小 #include "stdafx.h" #include <windows.h> int _t ...
- cdn 的配置及原理
CDN概况 CDN的全称是Content Delivery Network,即内容分发网络. CND加速主要是加速静态资源,如网站上面上传的图片.媒体,以及引入的一些Js.css等文件. CND加速需 ...
- 格式化抽象本地地址(实战linux socket编程)
格式化抽象本地地址传统AF_UNIX套接口名字的麻烦之一就在于总是调用文件系统对象.这不是必须的,而且也不方便.如果原始的文件系统对象并没有删除,而在bind调用时使用相同的文件名,名字赋值就会失败. ...
- 19. 接口(创建interface 继承implements)
1.语法: interface 接口名{ 属性 抽象方法 } 2.实例: 3.注意: 1)类实现接口可以通过implements实现,实现接口的时候必须把接口中的所有方法实现,一个类可以实现多个接口. ...