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

概述

开源/轻量级/分层式/一站式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 spring mvc 框架
个人分类: Java学习笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭