Spring知识点(一) 控制反转IoC

标签: spring spring mvc 框架
14人阅读 评论(0) 收藏 举报
分类:

概述

开源/轻量级/分层式/一站式full-statck框架
一站式:为三层架构(UIL,BLL,DAL)的每一层都提供了解决问题的全家桶技术
    表示(界面)层:SpringMVC
    业务层:SpringIoC
    数据访问层:Spring jdbcTemplate

核心

1.AOP Aspect Oriented Programming
    面向切面,扩展功能
2.IoC Inversion of Control
    控制反转,创建对象由Spring进行配置文件,然后通过反射创建对象.
    包括:
    依赖注入DI Dependency Injection(需要在IoC的基础上完成)
    依赖查找DL Dependency Lookup

版本

Spring4.x

SpringIoC

bean管理:1.配置文件 2.注解

IoC底层原理

1.xml配置文件
2.dom4j解决xml*
3.工厂设计模式
4.反射创建对象

原来:高耦合
servlet中
User user = new User();
user.method();
后来:工厂模式(工厂和serlvet还有耦合)
sevlet中
User user = UserFactory.getUser();
user.method();
再后来:IoC
1.创建一个配置文件

<bean id=”user” class=”xxx.User”></bean>
2.创建工厂类
使用dom4j解析xml*
使用反射创建对象
Class clazz = Class.forName(“class的路径”);
User u = clazz.getDxxConstuctor.newInsatnce();
3.使用工厂类得到User
User user = UserFactory.getUser();
user.method();

简单步骤

1.导jar包
docs:该文件夹下包含Spring的相关文档、开发指南及API参考文档;
dist:该文件夹下包含Spring jar包、文档、项目等内容;
    lib里面是jar包,每个文件有三种,jar包,文档,源代码
    只需要4个核心jar包即可 core,bean,context,expesion
    还需要日志包logging,log4j
    commons-logging-1.1.3.jar
    log4j-1.2.17.jar
schema:里面包含了Spring4所用到的xsd文件;
2.创建类,接口
3.xml文件
    (1)src下面ApplicationContext.xml
    位置和文件都不固定
    (2)引入schema约束(不再是dtd约束)
        docs/xx-references/html/
        Appendix 下面. XML Schemas
        找到说明文档Api,找到XML Schemas里面有beans跟标签的约束
    没有网的情况下,没有提示:
        *1.复制约束路径
        *2.在xmlCatalog中Add,key中放入刚才复制的路径
        *3.location中按照路径放入约束文件,使用最高版本,keyType选SchemlLocation
    (3)配置对象
4.测试即可

Bean实例化的方式

1.无参构造
<bean id=”user” class=”xxx.User”></bean>
2.静态工厂
<bean id=”” class=”工厂路径” factory-method=”getUserBean” />
3.实例工厂
<bean id=”beanFactory” class=”工厂路径” />
<bean id=”bean3” factory-bean=”beanFactory” factory-method=”getBean” />

Bean标签的常用属性

id              不能加下划线等特殊符号
class           全路径
name            和id功能一样,name可以包含特殊符号#_(不常用了,遗留)
scope           singleton,默认值
                prototype,多实例
                request,放到request域
                session,session域
                globaSession,globalSession域,单点登陆用 
factory-bean
factory-method
注:spring的bean管理单例模式是基于ApplicationContext的,如果application关闭了,那么就不是相同的对象了
例如:
public static void main(String[] args) {
    UserBean user1 = (UserBean) SpringUtil.getBean("userBean");
    user1.setUserId(98);
    UserBean user2 = (UserBean) SpringUtil.getBean("userBean");
    System.out.println(user2.getUserId());//98
}

属性注入

Java中依赖注入的三种方式:
1.构造器
2.set
3.接口注入(接口中有属性,有一个设置属性的方法)
@org.junit.Test
public void test2() {
    String path = "com.luhao.test.ClassA1";
    try {
        IClassA a = (IClassA) Class.forName(path).getDeclaredConstructor().newInstance();
        a.setA("接口设置属性");
        System.out.println(a.getA());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Spring:
1.set注入(重要)
2.构造器注入
3.不支持接口注入
4.p名称空间注入(可以区分属性)   

需要导入引用
xmlns:p="http://www.springframework.org/schema/p "
在bean中加入p:属性名="value"

constructor-arg 构造器
property 属性
ref 引用,对象类型属性

属性注入复杂类型

1.数组
2.list集合
3.map集合
4.propertie类型
<bean id="testBean" class="com.luhao.bean.TestBean">
<property name="id" value="1"></property>
<property name="arr">
    <list>
        <value>1</value>
        <value>2</value>
    </list>
</property>
<property name="list">
    <list>
        <value>3</value>
        <value>4</value>
    </list>
</property>
<property name="map">
    <map>
        <entry key="123" value="123"></entry>
        <entry key="321" value="321"></entry>
        <entry key="1234567" value="1234567"></entry>
    </map>
</property>
<property name="properties">
    <props>
        <prop key="user">root</prop>
        <prop key="password">luhao123</prop>
        <prop key="name">luhao</prop>
    </props>
</property>
</bean>

Spring整合Web项目原理

1.加载Spring核心配置文件

ApplicationContext context = new ClassPathXMLApplicationContext(Path);
new对象,功能可以实现,但是效率很低

2.思想:把加载配置文件和创建对象的过程的压力交给服务器

3.实现原理

使用ServletContext监听器来监听ServletContext的创建
- 在服务器启动的时候为每个项目创建ServletContext
- 监听到ServletContext创建的时候加载Spring配置文件,并创建对象
- 把创建出来的对象放到ServletContext域中

SpringBean管理 注解

注解:代码里面的特殊标记

@注解名称(属性名称=”属性值”)

可以使用在类上面,方法上面,属性上面

注解不可能完全脱离配置文件

1.注解:jar包 aop包...
2.约束:找Appendix 里面的 XML Schemas里面的  The context schema
<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd">

</beans>
3.开启注解扫描
<context:component-scan base-package="包名"></con...>
包名可以写逗号,还可以写通配符
<context:component-scan base-package="com.luhao"></context:component-scan>
4.注解创建对象
@Component(value="user") value可以省略
=<bean id="user" class="xx" /> 
Commponent/Controller/Service/Respository
这四个注解的功能是一样的,Spring在后续版本会对其进行增强
(单实例还是多实例,在类上面再加一个@Scope(vlaue="prototype"))
5.注入属性
@Autowired(自动装配),和注入的属性的类中component的value无关,根据类名自动找类
@Resource(name="类中的注解的value") 常用的

配置文件和注解混合使用

  • 1.创建对象一般使用配置文件 IoC
    2.注入属性一般使用注解 DI*

Util.Test找错小技巧
从Caused By 找错误信息

查看评论

不求人,自己实现spring IOC框架

-
  • 1970年01月01日 08:00

Spring框架中IoC(控制反转)的原理

一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对...
  • u012561176
  • u012561176
  • 2015-05-26 12:18:38
  • 15012

spring的IOC(控制反转)与AOP(面向切面编程)

一直对spring的两大特性IOC与AOP了解的模模糊糊,不知道怎么区分,怎么理解。 今天看了一篇讲spring常用注解的文章和spring AOP的文章,引用这两个作者的观点,感觉对这两个特性的了...
  • u013538390
  • u013538390
  • 2015-07-02 18:24:09
  • 2548

Spring的控制反转(IoC)和面向切面编程(AOP)的概念浅析。

转自:http://baike.baidu.com/link?url=BhIdxXwp9Xs7PjzebLL8sisJrgh0MiLUB2clkgpf-rpyexxlKTOXDDCxmX1MYe4qe...
  • suyu_yuan
  • suyu_yuan
  • 2016-09-18 21:57:32
  • 5766

【Spring】Spring的IOC(控制反转)/DI(依赖注入)原理(一):用到“反射”编程

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 ...
  • cangchen
  • cangchen
  • 2015-04-08 22:25:46
  • 2106

Spring 使用注解的方式实现IOC和DI(控制反转和依赖注入)

Spring 使用注解的方式实现IOC和DI 注解的方式实现IOC&DI     1、IOC操作       1)@Component  :用于实现ioc控制反转,属性value用于实现对象id定...
  • benxiaohai888
  • benxiaohai888
  • 2017-11-18 11:37:24
  • 451

Spring入门--控制反转(IOC)与依赖注入(DI)

1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接...
  • hy6688_
  • hy6688_
  • 2014-10-31 18:46:16
  • 9460

Spring之ioc控制反转(依赖注入)

个人感觉依赖注入比控制反转更好理解,所以下面就只说依赖注入: spring的整体结构示意图: 一、spring 中的概念:  beanFactory容器: 1、容器是spring框架的核心,容器...
  • QH_JAVA
  • QH_JAVA
  • 2015-02-08 17:16:59
  • 4401

Java面试-Spring IOC(控制反转)和DI(依赖注入)

IOCIoc(Inversion of Control)翻译成中文就是“控制反转”,一个比较晦涩的词语。如果要真正理解这个词语,必须要用过Spring框架才行,因为Spring开启了一种新的编程方式。...
  • u010902721
  • u010902721
  • 2016-10-04 23:18:07
  • 2295

Spring学习(三)IOC控制反转与DI依赖注入

IOC(Inversion of Control,控制反转)是spring的核心,贯穿始终。 所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系: 传统开...
  • icarus_wang
  • icarus_wang
  • 2016-05-19 23:10:33
  • 1291
    个人资料
    持之以恒
    等级:
    访问量: 4360
    积分: 537
    排名: 9万+