Spring的简单使用(1)
一:IOC(控制反转):它是由spring容器进行对象的创建和依赖注入,程序员使用时直接取出即可
正转:例如:
Student stu=new Student();
stu.setname("tom");
stu.setAge(20);
在正转中,由程序员自觉来创建对象,给对象注入值。
反转:由spring容器来自动创建对象。在spring.xml文件中如下:
<bean id="stu" class="com.ztb.dao.Student">
<property name="name" value="tom"></property>
<property name="age" value="20"></property>
</bean>
标签解释:id指的是创建的对象的名字,class表示要创建的对象在哪个包中的哪个类
property name表示成员变量的名字,value表示给成员变量赋值
给创建的对象赋值的两种方法:
A:使用setter方法注入:
注入分为简单类型注入和引用类型注入:
简单类型注入值使用value属性
引用类型注入值使用ref属性
注意:使用setter注入必须要有set方法和无参构造方法。
简单类型注入:
<bean id="school" class="com.ztb.pojo.School">
<property name="name" value="海淀大学"></property>
<property name="address" value="海定区"></property>
</bean>
引用类型注入:
有两个类School和Student,其中Student类中有school的对象:
private String name;
private String age;
private School school;
则引用注入如下:
<bean id="stu" class="com.ztb.pojo.Student">
<property name="name" value="zhangsan"></property>
<property name="age" value="20"></property>
<property name="school" ref="school"></property>
</bean>
<bean id="school" class="com.ztb.pojo.School">
<property name="name" value="海淀大学"></property>
<property name="address" value="海定区"></property>
</bean>
B:使用构造方法注入:
a:使用构造方法的参数名称进行注入值:
<bean id="school" class="com.ztb.pojo.School">
<constructor-arg name="name" value="海鼎"></constructor-arg>
<constructor-arg name="address" value="海鼎"></constructor-arg>
</bean>
b:使用构造方法参数的下标注入值:
<bean id="student" class="com.ztb.pojo.Student">
<constructor-arg index="0" value="zhangsan"></constructor-arg>
<constructor-arg index="1" value="20"></constructor-arg>
<constructor-arg index="2" ref="school"></constructor-arg>
</bean>
c:使用默认的构造方法的参数的顺序注入值:
<bean id="student1" class="com.ztb.pojo.Student">
<constructor-arg value="zhangsan"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
<constructor-arg ref="school"></constructor-arg>
</bean>
注意:使用构造方法注入必须要有有参构造方法
二:项目案例:使用三层架构进行用户的插入操作:界面层,业务逻辑层,数据访问层
1非spring接管的三层项目构建:
实体类:User
数据访问层:接口UserMapper,实现类UserMapperImpl
业务逻辑层:接口UserService,实现类UserServiceImpl
实现类中一定要有UserMapper对象,并且接口一定要指向实现类,UserMapper usermapper=new UserMapperImpl;
界面层:实现类UserController
实现类中一定要有UserServicer对象,并且接口一定要指向实现类,UserService userservice=new UserServiceImpl;
2:spring接管的三层项目构建:
实体类:
private Integer uid;
private String uname;
private String uage;
数据访问层:
public class UserMapperImpl implements UserMapper{
public int insert(User user) {
System.out.println(user.getUname()+"插入成功");
return 1;
}
}
业务逻辑层:
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public int insert(User user) {
return userMapper.insert(user);
}
界面层:
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public int insert(User user){
return userService.insert(user);
}
Spring整合:
<bean id="usermapper" class="com.ztb.dao.UserMapperImpl"></bean>
<bean id="userservice" class="com.ztb.service.UserServiceImpl">
<property name="userMapper" ref="usermapper"></property>
</bean>
<bean id="usercontroller" class="com.ztb.controller.UserController">
<property name="userService" ref="userservice"></property>
</bean>
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController usercontroller = (UserController) context.getBean("usercontroller");
usercontroller.insert(new User(1,"张三","3"));
spring接管的三层项目构建(使用注解):
实体类:
private Integer uid;
private String uname;
private String uage;
数据访问层:
@Repository
public class UserMapperImpl implements UserMapper{
public int insert(User user) {
System.out.println(user.getUname()+"插入成功");
return 1;
}
}
业务逻辑层:
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
public int insert(User user) {
return userMapper.insert(user);
}
}
界面层:
@Controller
public class UserController {
@Autowired
private UserService userService;
public int insert(User user){
return userService.insert(user);
}
Spring扫描包:
<context:component-scan base-package="com.ztb"></context:component-scan>
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController usercontroller = (UserController) context.getBean("userController");//因为默认是驼峰命名
usercontroller.insert(new User(1,"张三","3"));
三:基于注解的IOC,也称依赖注入
a:创建对象的注解:
@Component:可以创建任意对象,创建的对象默认名称是类名的驼峰命名法,也可以指定对象的名称
@Component
public class School {
@Value("海鼎")
private String name;
@Value("海定区")
private String address;
@Controller:专门用来创建控制器的对象(Servlet),这种对象可以接收用户的请求。可以返回处理结果给客户端
@Service:专门用来创建业务逻辑层的对象,负责向下访问数据访问层,处理完毕后的结果返回给界面层
@Repository:专门用来创建数据访问层的对象,负责数据库中的增删改查
注意:使用注解的IOC,需要在spring.xml文件中配置扫描包:
<context:component-scan base-package="com.ztb.pojo"></context:component-scan>
b:依赖注入的注解
值类型的注入:
@Value:用来给简单类型注入值:
@Component 创建的对象名默认为school
public class School {
@Value("海鼎")
private String name;
@Value("海定区")
private String address;
引用类型的注入:
1@Autowired:使用类型注入值,从整个Bean工厂中搜索同源类型的对象进行注入
同源类型:
a:被注入的类型(Student中的school)与注入的类型是完全相同的类型
@Component
public class Student {
@Value("张三")
private String name;
@Value("20")
private String age;
@Autowired
private School school;
@Component 创建的对象名默认为school
public class School {
@Value("海鼎")
private String name;
@Value("海定区")
private String address;
b:被注入的类型(Student中的school父)与注入的类型是父子类类型
public class Student {
@Value("张三")
private String name;
@Value("20")
private String age;
@Autowired
private School school;
@Component("school1")
public class School {
@Value("海鼎")
private String name;
@Value("海定区")
private String address;
@Component("school")
public class SubSchool extends School{
@Value("小海地")
private String name;
@Value("小海底")
private String address;
c:被注入的类型(Student中的school接口)与注入的类型是接口与实现类的类型
注意:在有父子类的情况下,使用按类型注入,就意味着有多个可注入的对象,此时按照名称进行二次筛选,选中与被注入对象相同名称的对象进行注入
2:@Autowired+@Qualifier:使用名称注入值,从整个Bean工厂中搜索相同名称的对象进行注入
a:被注入的类型(Student中的school)与注入的类型是完全相同的类型
@Component("school1")
public class School {
@Value("海鼎")
private String name;
@Value("海定区")
private String address;
@Component
public class Student {
@Value("张三")
private String name;
@Value("20")
private String age;
@Autowired
@Qualifier("school1")
private School school;
b:被注入的类型(Student中的school父)与注入的类型是父子类类型
@Component
public class Student {
@Value("张三")
private String name;
@Value("20")
private String age;
@Autowired
@Qualifier("school1")
private School school;
@Component("school1")
public class School {
@Value("海鼎")
private String name;
@Value("海定区")
private String address;
@Component("school")
public class SubSchool extends School{
@Value("小海地")
private String name;
@Value("小海底")
private String address;
四:为应用指定多个Spring配置文件:
1:
2:三层架构改造:

在total.xml中:
<import resource="applicationContext_*.xml"></import>汇总
Spring的简单使用(1)的更多相关文章
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- Spring的简单demo
---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...
- 1.Spring IoC简单例子
Spring IoC简单例子 1.IHelloMessage.java package com.tony.spring.chapter01; public interface IHelloMessag ...
- Spring mvc系列一之 Spring mvc简单配置
Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...
- 玩转spring boot——简单登录认证
前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...
- Spring.Net 简单实例-02(属性注入)
说明:接续Spring.Net 简单实例-01(IOC) 话不多说看操作 1:为UserInfo添加属性 2: 修改App.config中代码 <?xml version="1.0&q ...
- DI spring.net简单使用
IOC或DI spring.net简单使用 一.spring.net是什么? Spring 框架本是 Java 平台上一个应用非常多的.开源的框架.虽然语言是固定的,但是好的方法应该是通用的,于是 ...
- Spring的简单应用与基本原理
一:重要概念理解 Spring很简单,一定不要想得太复杂,只是有些东西很拗口而已 1:IOC(控制反转) 概念:利用反射的原理将对象创建的权利交给了Spring,Spring在运行的时候根据配置文件( ...
- Spring Framework简单介绍
Spring Framework 学习java编程不知不觉已经三年时间了,開始的时候,总是喜欢看着视频,然后按部就班的敲打着键盘,每当系统正常执行后.心里乐开了花.最開始的时候,所有的代 ...
- spring security 简单入门
spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...
随机推荐
- 流,用声明性的方式处理数据集 - 读《Java 8实战》
引入流 Stream API的代码 声明性 更简洁,更易读 可复合 更灵活 可并行 性能更好 流是什么? 它允许以声明方式处理数据集合 遍历数据集的高级迭代器 透明地并行处理 简短定义:从支持数据处理 ...
- Spring 源码(17)Spring Bean的创建过程(8)Bean的初始化
知识回顾 Bean的创建过程会经历getBean,doGetBean,createBean,doCreateBean,然后Bean的创建又会经历实例化,属性填充,初始化. 在实例化createInst ...
- 个人冲刺(三)——体温上报app(一阶段)
任务:完成了app第二页面的页面布局 activity_second.xml <?xml version="1.0" encoding="utf-8"?& ...
- Kitex源码阅读——脚手架代码是如何通过命令行生成的(一)
前言 Kitex是字节跳动内部的Golang微服务RPC框架,先已开源. Kitex文档:https://www.cloudwego.io/zh/docs/kitex/getting-started/ ...
- flex布局的总结
1.开启了flex布局的元素叫: flex container 2.里面的直接子元素叫:flex items(默认情况下,所有item都会在一行显示) 3.display属性由flex和inline- ...
- docker服务部署、迁移与备份、dockerfile、私有仓库
今日内容概要 服务部署 迁移与备份 dockerfile 私有仓库 内容详细 1.服务部署 # 装 mysql redis --->源码编译安装-->启 动 # 有了docker后,容器操 ...
- 技术分享 | Appium环境安装与架构介绍
原文链接 Appium架构 Appium 设计哲学 不需要为了自动化而重新编译或修改被测应用 不应该让移动端自动化测试限定在某种语言或者某个具体的框架 不要为了移动端的自动化测试而重新造轮子 移动端自 ...
- Java常用类-包装类
包装类 Java中的基本类型功能简单,不具备对象的特性,为了使基本类型具备对象的特性,所以出现了包装类,就可以像操作对象一样操作基本类型数据;包装类不是为了取代基本数据类型,而是在数据类型需要使用 ...
- iOS全埋点解决方案-APP和H5打通
前言 所谓的 APP 和 H5 打通,是指 H5 集成 JavaScript 数据采集 SDK 后,H5 触发的事件不直接同步给服务器,而是先发给 APP 端的数据采集 SDK,经过 APP 端数 ...
- 【SpringBoot】YAML 配置文件
博客主页:准Java全栈开发工程师 00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小.觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为 ...