一: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)的更多相关文章

  1. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

  2. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  3. 1.Spring IoC简单例子

    Spring IoC简单例子 1.IHelloMessage.java package com.tony.spring.chapter01; public interface IHelloMessag ...

  4. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  5. 玩转spring boot——简单登录认证

    前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...

  6. Spring.Net 简单实例-02(属性注入)

    说明:接续Spring.Net 简单实例-01(IOC) 话不多说看操作 1:为UserInfo添加属性 2: 修改App.config中代码 <?xml version="1.0&q ...

  7. DI spring.net简单使用

    IOC或DI  spring.net简单使用 一.spring.net是什么? Spring 框架本是 Java 平台上一个应用非常多的.开源的框架.虽然语言是固定的,但是好的方法应该是通用的,于是 ...

  8. Spring的简单应用与基本原理

    一:重要概念理解 Spring很简单,一定不要想得太复杂,只是有些东西很拗口而已 1:IOC(控制反转) 概念:利用反射的原理将对象创建的权利交给了Spring,Spring在运行的时候根据配置文件( ...

  9. Spring Framework简单介绍

    Spring Framework        学习java编程不知不觉已经三年时间了,開始的时候,总是喜欢看着视频,然后按部就班的敲打着键盘,每当系统正常执行后.心里乐开了花.最開始的时候,所有的代 ...

  10. spring security 简单入门

    spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...

随机推荐

  1. BUUCTF刷题记录(更新中...)

    极客大挑战 2019]EasySQL-1 直接通过输入万能密码:' or 1=1#实现注入: 思考:服务端sql语句应该为:select * from users where username='xx ...

  2. 【系统】查看windows系统是否永久激活

    查看windows系统是否永久激活 查看激活时间 slmgr.vbs -xpr 查看激活详情 slmgr.vbs -dlv

  3. Fail2ban 使用Fail2ban监禁SSH服务的恶意IP

    Fail2ban自带了很多服务的过滤器(filter)和动作(action),它已经帮你做好了,所以一般情况下我们无需定义,直接引用即可. 这边只是一个示例. 系统版本:Ubuntu 16.04.5 ...

  4. 利用SignalR创建即时消息

    1. 什么是SignalR? SignalR 是一个及时消息推送,它与.NET 的 WCF ,WebAPI类似 是客户端和服务器进行消息交换的一种工具 2.SignalR 的作用? 它可以实时同步在线 ...

  5. Hadoop入门学习笔记(二)

    Yarn学习 YARN简介 YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度 YARN功能说明 资源管理系统:集群的硬件资源,和程序运行相关,比如内存.CPU等. 调度平 ...

  6. CabloyJS微信模块、企业微信模块已出齐

    前言 当Cabloy-企业微信模块完成时,加上之前已完成的Cabloy-微信模块,关于在CabloyJS中与微信/企业微信对接的任务已经完成了.这些模块的目标就是,只需填入各类服务的参数,就可以直接进 ...

  7. MCDF实验2

    ​  目录 接口的使用 仿真的结束 类的例化和类的成员 接口的使用 问题1.1:可以看到之前的实验 channel initiator 发送的数据例如 valid 和 data 与时钟 clk 均在同 ...

  8. 左右手切换工具xmouse v1.2版本发布

    Xmouse 方便的切换鼠标左右键,因为功能非常简单,所以支持.net framework 2.0及以上 windows环境就可以了,目前已测试win7.win10可用. 关于为什么做这么个东西,那是 ...

  9. Linux文件的特殊属性

    文件的特殊属性 作用:文件的权限不能显示root用户,为了防止root用户的误操作,所以需要特殊属性来防止root用户的误操作. chattr工具: 可以给文件添加特殊的属性 +i:对这个文件不能修改 ...

  10. Python自动化办公:27行代码实现将多个Excel表格内容批量汇总合并到一个表格

    序言 (https://jq.qq.com/?_wv=1027&k=GmeRhIX0) 老板最近越来越过分了,快下班了发给我几百个表格让我把内容合并到一个表格内去.还好我会Python,分分钟 ...