spring入门

 

 

 

 

 

 

 

 

Spring 简介

什么是 spring :

  1、Spring是一个轻量级的DI/IoC和AOP容器的开源框架,来源于Rod Johnson 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。

  2、Spring提倡以”最少侵入”的方式来管理应用中的代码,这意味着我们可以随时安装或卸载Spring。

使用范围:

  任何Java应用 Spring根本使命:简化Java开发 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,致力于构建轻量级的JavaEE应用

Spring中常见术语:

  1、应用程序(application):是能完成我们所需要功能的成品,比如购物网站、OA系统。

  2、框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。

   3、非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。

  4、轻量级及重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。

  5、POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。

  6、容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。

Spring的优点:

   1.低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦。)

   2.声明式事务管理

   3.方便集成其他框架

   4.降低JavaEE开发难度

   5.Spring框架中包括JavaEE 三层(表现层,业务层,持久层)的每一层的解决方案


Ioc和DI介绍

IoC:Inverse of Control(控制反转):

读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,好比于MVC。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

正控:若调用者需要使用某个对象,其自身就得负责该对象的创建。

反控:调用者只管负责从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。

----------------------------------------------------------------------------

DI:Dependency Injection(依赖注入)

从字面上分析:

IoC:指将对象的创建权,反转给了Spring容器;

DI :指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。

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

Container:容器,在生活中容器就是一种盛放东西的器皿,从程序设计角度看作是装对象的对象,因为存在对对象的存入、取出等操作,所以容器还要管理对象的生命周期。


 

spring的基本配置

在Spring配置中,id和name属性都可以定义bean元素的名称,不同的是

id属性,遵守XML语法ID约束。必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号,不能以“/”开头。(ps:一般以对象名称小写作为ID)

name属性,就可以使用很多特殊字符,比如在Spring和Struts1或Spring MVC的整合中,就得使用name属性来的定义bean的名称。(用的比较少)

当然也使用name属性为<bean/>元素起多个别名,多个别名之间使用逗号或空格隔开,在代码中依然使用BeanFactory对象.getBean(...)方法获取。

<bean id="loginUser" name="hi,hi2" class="com.spring.day01.model.LoginUser">

或则

<bean id="loginUser" name="hi hi2" class="com.spring.day01.model.LoginUser">

建议:bean起名尽量规范,不要搞一些非主流的名字,尽量使用id。

在spring中引入其他配置文件:

在实际开发中,随着应用规模的增加,系统中<bean>元素配置的数量也会大量增加,导致applicationContext.xml配置文件变得非常臃肿。

为了避免applicationContext.xml文件过于庞大、臃肿,为提高其可读性,我们可以将一个applicationContext.xml文件分解成多个配置文件,然后在applicationContext.xml文件中包含其他配置文件即可。

使用import元素引入其他的配置文件:

<import resource="classpath:helloWord/helloWord.xml"/>

使用import元素注意:

1、默认情况下,从classpath的跟路径寻找。

2、可以使用前缀来定位文件的基础位置:

  ①:[classpath:]:后面的文件从classpath路径开始找(推荐);

  ②:[file:]:后面的文件使用文件系统的路径开(千万别用);

  注意:一般的,当框架中实现了Resource接口才能够识别上述的前缀标识符。

使用Spring测试准备:

依赖jar:

  Spring4.x需要依赖的单元测试得是最新的junit4.12,

  Eclipse自带的junit4.8不支持,同时从Spring4.x开始,还得依赖AOP包的支持。

    junit-4.12.jar hamcrest-core-1.3.jar

    spring-test-4.1.2.RELEASE.jar

    spring-context-4.1.2.RELEASE.jar

    spring-aop-4.1.2.RELEASE.jar

    spring-expression-4.1.2.RELEASE.jar

<?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">
    <!--把Ticket类交给spring管理-->
    <bean id="ticket" class="com.day2_spring.model.Ticket">
        <property name="startStation" value="成都东"/>
        <!-- collaborators and configuration for this bean go here -->
    </bean>
    <bean id="product" class="com.day2_spring.model.Product">
        <property name="productName" value="飞行堡垒"/>
        <!-- collaborators and configuration for this bean go here -->
    </bean>
    <!-- more bean definitions go here -->
</beans>
View Code
package com.day2_spring.testDao;

import com.day2_spring.model.Product;
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.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

//启动spring容器,把Junit运行在容器中
@RunWith(SpringJUnit4ClassRunner.class)
//加载配置文件"classpath:相对路径"
@ContextConfiguration("classpath:spring_config.xml")

public class testProduct {
    //自动配置
    @Autowired
    private BeanFactory beanFactory;
    @Test
    public void testP(){
        //从spring容器中创建对象
        Product product =(Product) beanFactory.getBean( "product" );//用ID取值
        Product product1 = beanFactory.getBean( Product.class );
        Object product2 = beanFactory.getBean( "product", product );
        //使用对象
    }
}
test Code

 自动装配,简单的属性注入

<?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">
    <!--把Ticket类交给spring管理-->
    <bean id="loginUser" class="com.day2_spring.model.LoginUser">
        <property name="userName" value="wuji"></property>
    </bean>
    <!-- more bean definitions go here -->
</beans>
XML config
package com.day2_spring.model;


public class LoginUser1 {
    private Integer id;
    private String userName;

    public Integer getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}
model code
 java Test

构造器参数名装配 

<?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">
    <!--把Ticket类交给spring管理-->
    <bean id="loginUser" class="com.day2_spring.model.LoginUser1">
        <property name="userName" value="wuji"></property>
    </bean>
    <!-- more bean definitions go here -->
</beans>
XML config
package com.day2_spring.model;


public class LoginUser2 {
    private  Integer userId;
    private String userName;
    public LoginUser2(Integer userId,String userName){
        this.userId = userId;
        this.userName= userName;
    }

}
model
package com.day2_spring.testDao;

import com.day2_spring.model.LoginUser1;
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.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:loginUser_config2.xml")
public class testUser2 {
    @Autowired
    private BeanFactory beanFactory;
    @Test
    public void testLoginUser(){
        LoginUser1 loginUser = (LoginUser1)beanFactory.getBean( "loginUser" );
        String userName = loginUser.getUserName();
        System.out.println(userName);
    }
}
Test code

构造器参数值装配

复合型类属性注入

//先注入子属性,再使用ref引用

 

原文地址:https://www.cnblogs.com/funkyd/p/9650584.html