我的spring之旅一

原创 2017年07月20日 23:55:08

spring的地位

1

如图可以看出,sping纵跨整个项目架构,它是一个容器框架。下面使用一个简单的项目来认识spring。

快速入门

step

1、新建一个普通java工程,spring只是一种容器,所以支持java se和java ee

2、引入spring的开发包(最小配置spring.jar 该包把常用的jar都包括, 还要 写日志包 common-logging.jar

2

3、新建一个叫UserService类

package com.ydc.service;

public class UserService {

    private String name;


    public String getName() {
        return name;
    }

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

    public void sayHello(){
        System.out.println("hello "+name );

    }

}

4、创建spring的一个核心文件 applicationContext.xml, [hibernate有核心 hibernate.cfg.xml struts核心文件 struts-config.xml], 该文件一般放在src目录下,该文件中引入 xsd文件 :

<?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"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">



</beans>

5、配置bean

<?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"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


    <bean id="userService" class="com.ydc.service.UserService">
        <property name="name">
            <value>杨德成</value>
        </property>
    </bean>

</beans>

配置说明:
a、bean元素的作用是,当我们的spring框架加载时候,spring就会自动的创建一个bean对象,。

<bean id="userService" class="com.ydc.service.UserService">

执行这段代码会创建一个以下对象

    UserService userSerivce=new UserService();

b、注入属性

<property name="name">
            <value>杨德成</value>
        </property>

执行完这个这段代码会给上面创建的对象属性赋值,体现了编程中常说的注入的概念。

    userSerivce.setName("杨德成");

Bean的作用域

9

使用scope来配置

<bean id="userService" class="com.ydc.service.UserService" scope="singleton">

比如我配置了“singleton”

UserService u=(UserService)ac.getBean("userService");
UserService u2=(UserService)ac.getBean("userService");

u和u2就是同一个实例对象,如果换成”prototype”,那么u和u2就会是两个不同的实例对象,默认使用的是”singlton”,prototype性能开销比较大,慎用。

其它的可以去查api文档,这里不做一一介绍。

sp17

6、新建测试类TestMain

public class TestMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
        //ApplicationContext ac=ApplicaionContextUtil.getApplicationContext();
        UserService u=(UserService)ac.getBean("userService");
        u.sayHello();
    }

a、通过配置文件applicationContext.xml实例化一个spring 的applicationContext对象(容器对象)。

b、解析XML文件,然后通过反射机制实例化bean,并且设置各个属性。

userService= Class.forName("com.service.UserService")
userService.setName("杨德成");

c、获得实例,可进行实例的一系列使用。

UserService u=(UserService)ac.getBean("userService");
u.sayHello();

通过上面的代码通过在配置文件中的id属性获得了对应的实例对象,我们并没有手动去new一个对象,这里又体现了编程中的另一个概念“ioc”

什么是ioc

ioc(inverse of controll ) 控制反转: 所谓控制反转就是把创建对象(bean),和维护对象(bean)的关系的权利从程序中转移到spring的容器(applicationContext.xml),而程序本身不再维护.

7、运行效果

3

下面把我的bean(这里指的是UserService类)复杂度提高

8、新建一个BybService类

package com.ydc.service;

public class BybService {

    private String name;

    public String getName() {
        return name;
    }

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

    public void sayBye(){
        System.out.println("bye"+name);
    }
}

9、在UserService引用或是依赖 BybService

5

10、修改核心配置文件applicationContext.xml

<?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"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


    <bean id="userService" class="com.ydc.service.UserService">
        <property name="name">
            <value>杨德成</value>
        </property>
        <property name="byeService" ref="bybService"></property>
    </bean>
    <bean id="bybService" class="com.ydc.service.BybService">
        <property name="name">
            <value>张三</value>
        </property>
    </bean>
</beans>

a、同样把新的bean配置进入。
b、配置依赖关系

<property name="byeService" ref="bybService"></property>

11、再次运行测试:

6

到此已经把我们编程中一个重要的概念DI 已经体现出来。

什么是DI
di(dependency injection) 依赖注入: 实际上di和ioc是同一个概念,spring设计者认为di更准确表示spring核心技术

运行原理

8

继续推进

12、创建一个接口 ChangeLetter

package com.ydc.service;

public interface ChangeLetter {

    //声明一个方法
    public String change();
}

13、创建一个大写字母转化类,并实现ChangeLetter接口

package com.ydc.service;

public class UpperLetter implements ChangeLetter {

    private String str;


    public String change() {
        //把小写字母->大写
        return str.toUpperCase();
    }


    public String getStr() {
        return str;
    }


    public void setStr(String str) {
        this.str = str;
    }

}

14、创建一个小写字母转化类,并实现ChangeLetter接口

package com.ydc.service;
public class LowwerLetter implements ChangeLetter {


    private String str;


    public String change() {
        // TODO Auto-generated method stub
        return str.toLowerCase();
    }


    public String getStr() {
        return str;
    }


    public void setStr(String str) {
        this.str = str;
    }

}

15、配置UpperLetter类

<?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"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


    <bean id="userService" class="com.ydc.service.UserService">
        <property name="name">
            <value>杨德成</value>
        </property>
        <property name="byeService" ref="bybService"></property>
    </bean>
    <bean id="bybService" class="com.ydc.service.BybService">
        <property name="name">
            <value>张三</value>
        </property>
    </bean>


    <bean id="changeLette" class="com.ydc.service.UpperLetter">
        <property name="str">
            <value>yangdecheng</value>
        </property>
    </bean>
</beans>

看到没有,这里并没有配置接口。

16、点击运行

6

通过代码可以看出,我们可以通过获取接口来调用配置文件中所配置的接口实现类的相应方法。

17、修改为配置另外一个实现类LowwerLetter

<?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"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


    <bean id="userService" class="com.ydc.service.UserService">
        <property name="name">
            <value>杨德成</value>
        </property>
        <property name="byeService" ref="bybService"></property>
    </bean>
    <bean id="bybService" class="com.ydc.service.BybService">
        <property name="name">
            <value>张三</value>
        </property>
    </bean>


    <!-- <bean id="changeLette" class="com.ydc.service.UpperLetter"> <property 
        name="str"> <value>yangdecheng</value> </property> </bean> -->

    <bean id="changeLette" class="com.ydc.service.LowwerLetter">
        <property name="str">
            <value>YDC</value>
        </property>
    </bean>
</beans>

18、点击运行

7

spring可以使用接口编程配合di技术实现层与层的解耦

bean的生命周期

sp10

快速了解

step

1、重新建立一个bean类


public class PersonService {

    private String name;
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public PersonService(String abc){
        System.out.println("PersonService 有参数构造函数");
    }

    public PersonService(){
        System.out.println("PersonService 无参数构造函数");
    }

    public void setName(String name) {
        System.out.println("setName(String name) 函数");
        this.name = name;
    }

}

2、配置bean

<?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"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


    <bean id="personService" class="com.ydc.beanlife.PersonService">
        <!-- 这里注入我们属性,前提就是有setName才能ok -->
        <property name="name">
            <value>xiaoming</value>
        </property>
    </bean>

</beans>

看见没,默认是会调起无参的构造函数,可以修改配置来调用有参构造函数。

3、测试运行

sp11

4、让bean(PersonService)实现BeanNameAware接口

    @Override
    public void setBeanName(String arg0) {

        System.out.println("setBeanName 被调用 值"+arg0);

    }

sp12

看见没,该方法可以获取正在被实例化的bean 指定的id

5、让bean(PersonService)实现BeanFactoryAware接口

@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
    // TODO Auto-generated method stub
    System.out.println("setBeanFactory "+arg0);
}

sp13

看见没,该方法可以传递beanFactroy

6、让bean(PersonService)实现ApplicationContextAware接口

@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
    // TODO Auto-generated method stub
    System.out.println("setApplicationContext"+arg0);
}

sp14

看见没,该方法传递ApplicationContext

7、让bean(PersonService)实现InitializingBean接口


@Override
public void afterPropertiesSet() throws Exception {
    // TODO Auto-generated method stub
    System.out.println("afterPropertiesSet()");
}

sp15

看见没,该方法实在创建完bean之后被调用的。

8、让bean(PersonService)实现DisposableBean接口

@Override
public void destroy() throws Exception {
    System.out.println("释放各种资源");

}

该方法在当前的bean被销毁时被调起。

可以不实现销毁接口,自己定制一个销毁的方法

@PreDestroy
    public void mydestory() {
        System.out.println("释放各种资源");
    }

然后在配置一下定制的方法

<bean id="personService"  destroy-method="mydestory"    class="com.ydc.beanlife.PersonService" >

9、替代上面的InitializingBean接口

a、新建一个类似过滤器的后置处理器MyBeanPostProcessor类


public class MyBeanPostProcessor implements BeanPostProcessor {

    public Object postProcessAfterInitialization(Object arg0, String arg1)
            throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("postProcessAfterInitialization 函数被调用");
        System.out.println(arg0+" 被创建的时间是"+new java.util.Date());
        return arg0;
    }

    public Object postProcessBeforeInitialization(Object arg0, String arg1)
            throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("postProcessBeforeInitialization 函数被调用");
        return arg0;
    }

}

看见没,该类实现了BeanPostProcessor接口,见文生意,bean创建进度监控。

b、在配置文件中添加MyBeanPostProcessor

    <bean id="myBeanPostProcessor" class="com.ydc.beanlife.MyBeanPostProcessor" />

c、测试

sp16

相关文章推荐

我的Spring之旅(二):为请求添加参数

从零开始Spring之旅
  • SoulHao
  • SoulHao
  • 2014年07月12日 18:38
  • 877

Spring Integration之旅1——用Maven构建项目

前奏: 公司用Spring Integration开发项目,之前连Spring都没用过,java的web项目也没怎么写过。无奈,只好一点一点地从入门形如学。 Spring Integration的官网...

Spring学习之旅(七) 使用属性文件

简单看看如何使用属性文件配置项目

Java之旅Spring框架学习(2)——让你的编程变得“被动”

上篇博客大致了解了Spring的一些知识,这次我们通过一个例子来了解Spring常用的两种注入方式构造器注入和setter注入。先看例子。   因为spring是一个轻量级的框架与创建的项目类型无关...

Spring Cloud 学习之旅 --- 断路器

微服务 服务消费 断路器
  • mr_pr
  • mr_pr
  • 2017年06月20日 11:56
  • 114

第1章 Spring之旅(笔记)

Spring的诞生对于Java工程师是一件极具历史意义的事,因为它不仅简化了java开发,这对于推荐"码农"这个职业也是具有一定意义的.当然我对码农的理解是褒义的,因为当今的社会,和电脑交流比和人交流...

我的Spring之旅——(一)构建项目

近几天在学习spring aop的应用,遇见了形形色色的问题,下面我就简单的叙述一下我的项目构建和此过程中遇见的问题,希望可以共勉。 一、在Idea中创建SpringMaven项目(这个很多博客都有详...

菜鸟的spring 3.0源码学习之旅(3)

今天把,也算不上是什么好时候,前天,我的邻居阿姨因为癌症不幸逝世了,在感叹现在癌症的肆虐以及声明的卑微的时候,我的另一个邻居,因为这几年长期在别的地方居住,所以我们邻居这个房子最近常年无人居住,致使若...

我的Spring之旅——(三)AOP通知的几种类型

为了搞明白AOP通知的类型之间有什么区别,我也是走了一些小弯路,下面就把我遇见的坑坑洼洼扒拉出来凉一凉吧~ 一、AOP的通知类型 1.前置通知(before advice):在连接点前面执行,对连接点...

菜鸟的spring 3.0源码学习之旅(6)

昨天我们讲了有关XmlBeanFactory的一些东东,不知道大家有没有收获,反正我是有,它用高度的封装,富有层次的接口去实现了这些功能,我觉得呢,更重要的是,它让我对编写代码的思维方式有了一定的优化...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的spring之旅一
举报原因:
原因补充:

(最多只允许输入30个字)