Spring知识点回顾1

        在结束校招之后,一直忙着自己的毕业课题(物联网方向),已经半年没有接触到Java Web的代码了,5月份就要入职某知名通信设备商了,岗位为后端开发工程师,因此将Spring方面的知识点重新复习下,希望毕业能够尽快融入到工作中。

        Spring存在的目的就是为了简化企业的开发,Spirng解决了对象的创建、以及对象的依赖关系!它是基于IOC和AOP来架构多层JavaEE系统的框架,Spring降低组件之间的耦合度,实现软件各层之间的解耦。Spring主要包括了一下几个模块:


        下面简述下这些模块的主要功能:

1.IOC(依赖注入):包含并管理应用对象的配置和生命周期,你可以配置你的每个bean如何被创建,也可以配置每个bean是只有一个实例,还是每次需要时都生成一个新的实例,以及它们是如何相互关联的。
2.AOP(面向切面):采用了面向切面编程来实现很多基础但是与业务逻辑无关的功能的解耦,比如:事务管理、日志、权限验证.....
3.DAO:Spring 还提供了对数据库JDBC的封装,使用JdbcTemplate来简化数据操作。
4.ORM:提供了对主流的对象关系映射框架的支持。
5.JEE: 对Java企业级开发提供了一些解决方案,例如EJB、JMS等。

6.WEB: 提供了自己的Spring MVC和对显示层框架的集合支持 。

下面我们就通过一个简单的案例来介绍Spring:

在做练习之前,我们首先要将该练习所需要的Jar包导入IDEA中,导包步骤为:File->Project Structure->Modules->Dependencies->点击绿色的加号,加入所需要的Jar包。然后我们依次编写以下几个文件代码。

applicationContext.xlm

<?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:p="http://www.springframework.org/schema/p"
       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.scd">

      <!-- IOC容器的配置: 要创建的所有的对象都配置在这里-->
      <bean id="user" class="cn.zj.a_hello.User" init-method="init_user"
            destroy-method="destory_user" scope="singleton" lazy-init="false"></bean>

      <bean id="user1" class="cn.zj.a_hello.User"></bean>
</beans>

        这个XML的配置模版可以从spring的参考手册或者其他关于spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目录下,但考虑到通用性,一般放在类路径下,在编写IDEA的Maven项目时,我一般将XML文档放在resources目录下,便于ClassPathXmlApplicationContext读取该目录下的配置文件。

       下面我们就详细的分析applicationContext.xlm中每一句的意思。

<?xml version="1.0" encoding="UTF-8"?>

 version="1.0" 声明xml版本是1.0。encoding="UTF-8" 声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码。

<beans xmlns="http://www.springframework.org/schema/beans"

表示初始化bean的格式文件地址

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

辅助初始化bean,声明XML Schema实例,声明后就可以使用schemaLocation属性。

xmlns:p="http://www.springframework.org/schema/p"

Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式,可以给XML配置文件"减肥"。

xmlns:context="http://www.springframework.org/schema/context"

关于spring上下文,包括加载资源文件

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.scd">
xsi:schemaLocation:指的是命名空间所对应的验证文件,它是用来定义xml schema的地址,也就是xml书写时需要遵循的语法。其用于声明了目标命名空间的模式文档。它主要由两部分组成,前面部分就是命名空间的名字,后面是xsd(xmlschema)的地址,也是就表示把定义这个命名空间的schema文件给引用进来,好让编辑器能够解析和验证你的xml文件是否符合语法规范。相当于用于声明了目标命名空间的模式文档。
<bean id="user" class="cn.zj.a_hello.User" init-method="init_user"
            destroy-method="destory_user" scope="singleton" lazy-init="false"></bean>

其中id作为bean的名称,而class作为bean的路径。init-method指定对象的初始化方法,destroy-method指定对象的销毁方法(仅对单例模式有效)。单例模式 scope="singleton",多例模式 scope="prototype"。立即加载,表示在spring启动时,立刻进行实例化。

        Bean就相当于Spring中的一个组件,这个组件的作用就是实现某个功能的。在Spring里给定义的bean就是说,我给你了一个更为简便的方法来调用这个组件去实现你要完成的功能。Bean配置信息是Bean的元数据信息,它主要由四个部分组成。1.Bean的实现类 

2.Bean的属性信息,如数据库的连接数、用户名、密码

3.Bean的依赖关系,Spring根据依赖关系配置完成Bean之间的装配

4.Bean的行为配置,如生命周期范围及生命周期各过程的回调函数。

        Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java反射功能实例化Bean并建立Bean之间的依赖关系。Spring的Ioc容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。BeanFactory是Spring框架最核心的接口,它提供了高级Ioc的配置机制。ApplicationContext建立在BeanFactory之上,面向开发者,一般称为Spring容器。

        配置文件中的User为:

package cn.zj.a_hello;

public class User {
    private int id=100;
    private String name="zhangsan";

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User() {
        super();
        System.out.println("----User对象创建-----");
    }

    public void init_user(){
        System.out.println("创建对象之后,初始化");
    }

    public void destory_user(){
        System.out.println("IOC容器销毁,user对象回收");
    }
}

        在完成了配置文件之后,我们写了一个简单测试用例:Pro_get_ioc.java。它主要是用来加载xml配置文件,通过factory来直接调用Bean来创建对象。

package cn.zj.a_hello;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;

public class Prc_get_ioc {
    //方法1:通过工厂类获得IOC容器创建的对象
    @Test
    //Ctrl+Alt+V:自动补全前面的代码
    public void testIOC() throws Exception {
//        User user = new User();
        //XmlBeanFactory过期了,用下面的代码代替

        //现在把创建对象交给Spring的IOC容器
        //ClassPathXmlApplicationContext在classpath找到xml文件
        ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) factory.getBean("user");
        System.out.println(user.getId());
    }

    //直接得到IOC容器对象(比较方便)
    @Test
    public void testAc()throws Exception{
        //得到IOC容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从容器中获取bean
        User user = (User) ac.getBean("user1");
        System.out.println(user.getName());

    }
}

        Pro_get_bean.java是操作bean的文件,通过ClassPathXmlApplicationContext来加载XML文档,值得注意的是,在建立mean项目时,XML的位置应该放在resources目录下,否则会报找不到applicationContext.xml文件的错误。

package cn.zj.a_hello;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Prc_get_bean {
    /**
     * 1) 对象创建: 单例/多例
     * 	scope="singleton", 默认值, 即 默认是单例	【service/dao/工具类】
     *  scope="prototype", 多例; 				【Action对象】
     *
     * 2) 什么时候创建?
     * 	  scope="prototype"  在用到对象的时候,才创建对象。
     *    scope="singleton"  在启动(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
     * 3)是否延迟创建
     * 	  lazy-init="false"  默认为false,  不延迟创建,即在启动时候就创建对象
     * 	  lazy-init="true"   延迟初始化, 在用到对象的时候才创建对象
     *    (只对单例有效)
     * 4) 创建对象之后,初始化/销毁
     * 	  init-method="init_user"       【对应对象的init_user方法,在对象创建爱之后执行 】
     *    destroy-method="destroy_user"  【在调用容器对象的destriy方法时候执行,(容器用实现类)】
     */

    @Test
    public void testIOC()throws Exception{
        //得到IOC容器对象,用实现类,因为要调用销毁的方法
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("-----容器创建-------");

        //从容器中获取bean
        User user1 = (User) ac.getBean("user");
        User user2 = (User) ac.getBean("user");

        System.out.println(user1);
        System.out.println(user2);

        //销毁容器对象
        user1.destory_user();
        }

@Test
public void test()throws Exception{
        //容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("------容器创建完成------");
        User user = (User) ac.getBean("user");
        }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值