Spring学习笔记(1)

nibiru 2019年05月05日 51次浏览

Spring简单介绍

Spring是一个开源框架,Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,由Rod Johnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是 为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使 用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、 可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 的核心是控制反转 (IoC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级 开源框架。


EE 开发分成三层结构:

  • WEB 层:Spring MVC.
  • 业务层:Bean 管理:(IOC)
  • 持久层:Spring 的 JDBC 模板.ORM 模板用于整合其他的持久层框架.

IOC的底层实现原理

spring1-1

  • IOC:Inversion of Control 控制反转. 指的是 对象的创建权反转(交给)给 Spring. 作用是实现了程序的解耦合.
  • DI :Dependency Injection 依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去.

初学代码测试

编写相关的类

public class SpringTest {

    public void say()
    {
        System.out.println("hello,Spring!!");
    }
}

配置对象创建

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="sayhello" class="cn.lcx.bean.SpringTest"></bean>
    
</beans>

编写测试代码

public class SpringDemo01 {

    public static void main(String[] args) {
        //加载spring配置文件,根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //得到配置创建的对象
       SpringTest springTest =(SpringTest)context.getBean("sayhello") ;
       System.out.println(springTest);
       springTest.say();
    }
}

控制台输出:

spring1-2

Spring 的相关配置

id 属性和 name,class 属性标签的配置

  • id:给bean起个名字,在约束中采用id的规范:必须以字母开始,命名规则参考变量,不能出现特殊字符
  • name:也是给bean起个名字,可以出现特殊字符,struts1的历史遗留
  • class:创建对象所在类的全路径

scope 属性:Bean 的作用范围

  • singleton:默认值,单例的.
  • prototype:多实例
  • request:WEB项目中,Spring创建一个Bean对象,放入request域中
  • session:同上
  • globalSession:应用在Portlet环境中,如果没有此环境,相当于session
  • (了解)Portlet是基于Java的Web组件,由Portlet容器管理,并由容器处理请求,生产动态内容。Portals使用Portlets作为可插拔用户接口组件,提供信息系统的表示层。作为利用Servlets进行Web应用编程的下一步,Portlets实现了Web应用的模块化和用户中心化。 Portlet规范,即JSR(Java Standardization Request )168,是为了实现Portal和Portlet的互操作。它定义了Portlet和Portlet容器之间的合约,让Portlet实现个性化、表示和安全的API集。规范还定义了怎样在Portlets应用中打包Portlets。

Bean 的生命周期的配置

通过配置< bean >标签上的init-method作为Bean的初始化的时候执行的方法,配置destroy-method作为Bean 的销毁的时候执行的方法。
销毁方法想要执行,需要是单例创建的Bean 而且在工厂关闭的时候,Bean才会被销毁.

Spring 生成 Bean 的时候三种方式

无参数的构造方法的方式(常用)

<bean id="sayhello" class="cn.lcx.bean.SpringTest"></bean>

静态工厂实例化的方式

提供一个工厂类,创建静态的方法,返回类对象
public static Bean1 getBean1()
    {
        return new Bean1();
    }

 <bean id="bean1" class="cn.lcx.bean.BeanFactory1" factory-method="getBean1"></bean>

实例工厂实例化的方式

创建不是静态的方法,返回类对象

public Bean2 getBean2()
    {
        return new Bean2();
    }

     <bean id="bean2Factory" class="cn.lcx.bean.BeanFactory2"></bean>
    <bean id="bean2" factory-bean="bean2Factory" factory-method="getBean2"></bean>

Spring 的 Bean 的属性注入

构造方法的属性注入

 private String username;
    public SpringTest(String username) {
        this.username = username;
    }
    public void say()
    {
        System.out.println("hello,Spring!!"+username);
    }



    <bean id="demo" class="cn.lcx.bean.SpringTest">
        <constructor-arg name="username" value="小溪"></constructor-arg>
    </bean>

spring1-3

set 方法的方式注入属性

private String username;
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void say()
    {
        System.out.println("hello,Spring!!"+username);
    }


    <bean id="demo1" class="cn.lcx.bean.SpringTest">
        <!--name:类里面定义的属性名称-->
        <!--value:设置具体的值-->
        <property name="username" value="小小溪"></property>
    </bean>

spring1-4

注入对象类型属性

思路:

  • 创建service类和dao类,在service得到dao对象
  • 在service里面把dao作为类型属性,生成dao类型属性的set方法
public class UserService {

    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void say()
    {
        System.out.println("service.....");
    }
}


<bean id="userdao" class="cn.lcx.bean.UserDao"></bean>
    <bean id="userservice" class="cn.lcx.bean.UserService">
        <!--name:service类里面属性的值-->
        <!--ref:dao配置bean标签中的id值-->
        <property name="userDao" ref="userdao">
        </property>
    </bean>

注入复杂类型属性

数组

<property name="arrs">
            <list>
                <value>数组内容1</value>
                <value>数组内容2</value>
                <value>数组内容3</value>
            </list>
        </property>

list集合

<property name="list">
            <list>
                <value>list内容1</value>
                <value>list内容2</value>
                <value>list内容3</value>
            </list>
        </property>

map集合

<property name="map">
            <map>
                <entry key="aaa" value="111">
                <entry key="bbb" value="222">
                <entry key="ccc" value="333">
            </map>
        </property>

Properties 的注入

<property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">abc3770166</prop>
            </props>
        </property>