博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring学习笔记(三)
阅读量:6172 次
发布时间:2019-06-21

本文共 6045 字,大约阅读时间需要 20 分钟。

本教程对应视频课程:

1、ioc和di

1.1、IOC容器

1.1.1、ObjectFactory 和ApplicationContext

BeanFactory:这个接口是spring中最底层的接口,只提供了最简单的IoC功能(创建bean,获取bean,销毁bean)

在一般的应用当中,一般不使用BeanFactory;推荐用ApplicationContext(应用上下文);

1.ApplicationContext继承了BeanFactory,提供了基本的IoC功能;

2.ApplicationContext还提供了其他功能,比如支持国际化,消息机制,统一的资源加载,AOP功能等

1.1.2、ApplicationContext的实现类

1、ClassPathXmlApplicationContext:读取classpath中的资源

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

2、FileSystemXmlApplicationContext

ApplicationContext ac = new FileSystemXmlApplicationContext("c:/licationContext.xml");

3、XmlWebApplicationContext

XmlWebApplicationContext ac = new XmlWebApplicationContext();// 需要指定ServletContext对象ac.setServletContext(servletContext);// 指定配置文件路径,开头的斜线表示Web应用的根目录ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 初始化容器ac.refresh();

1.1.2、Resource常用实现类

ClassPathResource:从classpath根路径开始找配置文件

FileSystemResource:从磁盘的文件路径去找c://xx.xml

ServletContextResource:应用于web中,从web中去找配置文件

1.2、Bean的创建时机

1.ApplicationContext在加载的时候就会创建所有的bean(Web应用建议)

2.BeanFactory需要等到拿bean的时候才会创建bean(延迟加载)(桌面程序)

延迟加载

ApplicationContext做到延迟加载的效果:

针对于当前xml中所有的bean。

<beans default-lazy-init="default | false | true">

针对于指定的bean:

<beans lazy-init="default | false | true">

1.3、Bean的作用域

singleton: 单例 :在Spring IoC容器中仅存在一个Bean实例 (默认的scope)

prototype: 多例 :每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new 不会在容器启动时创建对象

对于MVC中的Action(Struts2)使用prototype类型,其他使用singleton

1.4、初始化和销毁方法

init-method:bean生命周期初始化方法,对象创建后就进行调用

destroy-method:容器被销毁的时候,如果bean被容器管理,会调用该方法。

如果bean的scope="prototype",那么容器只负责创建和初始化,它并不会被spring容器管理。

1.5、Bean的实例化的方式

1.5.1、构造器

构造器实例化,最标准,使用最多

java类

public class SomeBean1 {}

xml配置

1.5.2、静态工厂方式

java类

public class SomeBean2Factory {    public static SomeBean2 getSomeBean2(){        return new SomeBean2();    }}public class SomeBean2 {}

xml配置

此时我们通过上下文对象获取id为someBean2的对象,这个对象的类型为SomeBean2

1.5.3、实例工厂方式

实例工厂方法实例化:解决系统遗留问题,有点麻烦,使用比较少

public class SomeBean3 {}public class SomeBean3Factory {    public SomeBean3 getSomeBean3() {        return new SomeBean3();    }}

xml配置

此时我们获取id为someBean3的对象,实际上会创建实例工厂,然后在通过实例工厂的工厂方法来或者SomeBean3的对象

1.5.4、实现FactoryBean接口实例化

java类

public class SomeBean4 {}public class SomeBean4FactoryBean implements FactoryBean
{ //返回对象 public SomeBean4 getObject() throws Exception { return new SomeBean4(); } //返回对象的类型 public Class
getObjectType() { return SomeBean4.class; } //返回是否单例 public boolean isSingleton() { return true; }}

xml配置

1.6、DI和ioc介绍

IoC(inverse of control):指将对象的创建权,反转到Spring容器;

DI (Dependency Injection) :指Spring创建对象的过程中,将对象依赖属性通过配置进行注入 。

其实它们是同一个概念的不同角度描述。DI相对IoC而言,明确描述了”被注入对象依赖IoC容器配置依赖对象”。

1.6.1、注入方式

使用setter注入:

1.使用bean元素的property子元素设置;

​ 简单类型值,直接使用value赋值;

​ 引用类型,使用ref赋值;

​ 集合类型,直接使用对应的集合类型元素即可。

2.spring通过属性的setter方法注入值;

3.在配置文件中配置的值都是string,spring可以自动的完成类型的转换

4.属性的设置值是在init方法执行之前完成的

构造器注入

1.spring在实例化对象的时候,如果对象没有配置constructor-arg,则使用默认的构造器实例化对象

2.如果有constructor-arg,那么spring使用这些constructor-arg来唯一确定一个构造器

1.6.2、注入值的类型

1、简单类型数据

java类编写

public class Employee {    private String name;    private Integer age;    private Double salary;    private URL url;       省略setter/getter}

xml配置

2.对象类型的值

java类

public class EmpDAO {    public void save(){        System.out.println("EmpDAO.save()");    }}public class EmpService {    private EmpDAO dao;//持有一个引用数据类型    public void setDao(EmpDAO dao) {        this.dao = dao;    }    public void save() {        dao.save();        System.out.println("EmpService.save()");    }}

xml文件配置

3.注入集合类型

java类

public class ConnectionBean {    private Set
set; private List
list; private String[] array; private Map
map; private Properties prop; 省略setter/getter}

xml文件配置

set1
set2
set3
list1
list2
list3
array1
array2
array3
pVal1
pVal2
pVal3

1.7、属性占位符

1、添加jar包

使用DataSource的案例,给数据源注入Property中的数据加入相关jar包支持

commons-dbcp-1.2.2.jar、commons-pool-1.5.3.jar、com.springsource.oracle.jdbc-10.2.0.2.jar

2、引入context命名空间

3、拷贝db.properties文件

db.driver=oracle.jdbc.driver.OracleDriverdb.url=jdbc:oracle:thin:@127.0.0.1:1521:orcldb.username=scottdb.password=tiger

4、加载配置文件

5、测试

package cn.org.kingdom.test;import org.apache.commons.dbcp.BasicDataSource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;@RunWith(SpringJUnit4Cla***unner.class)@ContextConfigurationpublic class SpringTest {    @Autowired    private BeanFactory factory;    @Autowired    private AbstractApplicationContext ctx ;     @Test    public void testSpringTest() throws Exception {        BasicDataSource ds = (BasicDataSource) ctx.getBean("ds");        System.out.println(ds.getConnection());    }}

转载于:https://blog.51cto.com/11230344/2287871

你可能感兴趣的文章
lua/luajit and tcc
查看>>
前端安全即JS代码安全,前端源码安全探讨!
查看>>
如何快速实现异地不同网络打印机共享
查看>>
openinstall免费服务对App推广有哪些作用?
查看>>
基于Docker的微服务CI CD流水线
查看>>
学好SEO需要掌握哪些知识要点?
查看>>
JetBrains GoLand macv2019.1.2中文版如何换成无牵引模式?
查看>>
电气火灾监控系统工作原理
查看>>
中使馆驳斥《金融时报》“中国网络威胁论”
查看>>
【挨踢人物传】茶乡浪子:“传奇”职场路,一生感谢情(第12期)
查看>>
我的友情链接
查看>>
c#关于数据库连接操作的案例
查看>>
聊聊最近接触的媒体查询!
查看>>
HAproxy指南之haproxy重定向应用(案例篇)
查看>>
学习 HTTP协议挺不错的一个类
查看>>
深入字节码 -- ASM 关键接口 MethodVisitor
查看>>
linux 文件权限
查看>>
Linux常用命令集合
查看>>
Oracle DML
查看>>
Linux - FHS文件系统层次标准
查看>>