Spring入门

Spring概述

spring是一个开源的框架
IoC(控制反转)

Spring是一个分层的JavaSE/EE一站式轻量级的Java开源框架。

Spring为了解决企业应用开发的复杂性而创建的。
框架的主要优势之一就是其分层架构
,分层框架允许使用者选择使用哪个组件,同时为J2EE应用程序开发提供集成的框架。

###########################################################
Spring使用基本的JavaBean来完成以前可能由EJB完成的事情。
Spring的核心是控制反转(loC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架。

spring是一站式的轻量级开源框架的原因?

EE开发可分为三层架构
针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。

***web层:***:SpringMVC
service层:Spring的loC,例如Spring的Bean管理、Spring声明式事务
dao层:Spring的JDBCTemplate(Spring的JDBC模板)
Spring的ORM模板(用于整合其他持久层框架,比如Hibernate)

Spring的核心部分(两个部分)

IoC(控制反转)

IoC:控制反转。比如:一个类A中,需要用到另一个类B的方法,那么我们就要在A中实力化B,然后调用B的方法,代码:

Class A{
	private Class b = new ClassB();
	b.method();
}

如果由C、D类,当他们都需要用到B的方法的时候,同样也需要实例化B,然后再调用B中的方法。如果B的实例化是一个非常消耗系统资源的过程,比如数据库连接等,那么每次一个类中需要调用B的方法,就要实例化B一次,这将是一个非常消耗系统资源的过程。

在Spring框架中对以上进行实现:
我们每次使用Spring框架是要配置xml文件,xml文件配置bean的·id合class,spring中默认的bean为单实例模式,而且通过bean的class,通过反射机制可以创建这个实例,因此spring的框架通过反射替我们创建好了实例并且替我们维护他们,A需要引用B类,在xml通过构造器或者属性把B注入到A中,其实就是spring框架,把B实例的引用传给了A的成员变量。

Spring实现控制反转的三种方式

Spring IoC的属性注入(set注入)方法,
代码:

package com.zhizhi;

import sun.jvm.hotspot.runtime.ArgumentSizeComputer;

public class Student {

    private String name;
    private String sex;

    //在这里定义要依赖的teacher属性,加上set方法
    private Teacher teacher;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
}

teacher类
package com.zhizhi;

public class Teacher {

    private String name;
    private String clazz;

    //自定义的方法
    public void xinSheng(){
        System.out.println("招到了一个新的学生");

    }

    public String getName() {
        return name;
    }

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

    public String getClazz() {
        return clazz;
    }

    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
}

从上面代码可以显示出:Student类有三个属性:name、sex、teacher,并且都有对应的getter、setter方法,Teacher类里面有两个属性。分别是姓名,班级,也有对应的geeter、setter方法,
即第一步:在类里面声明属性并且实现set方法。
第二步:编写一个spring的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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="student" class="com.zhizhi.Student">
        <property name="name" value="郭郭"></property>
        <property name="sex" value="男"></property>
        <property name="teacher" ref="teacher"></property>

    </bean>

    <bean id="teacher" class="com.zhizhi.Teacher">
        <property name="name" value="智智"></property>
        <property name="clazz" value="二班"></property>
    </bean>

</beans>

在上面的xml文件中:
1、声明一个bean,可以理解为去实例化了一个对象,上面代码中实例化了两个对象,分别是student和teacher,各个属性都已经赋值上去了。
2、id为student的bean。其实就是Student类,通过propetry赋值,Spring就会通过Student类的各个属性的set方法,逐一给Student类的·属性赋值。
3、在student类里面,有一个属性是teacher,可以看到他属性值是ref=“teacher”,这就说明teacher这个属性是一个引用,这里ref后面的值其实就是指向另一个bean的id值,所以这里引用的是id为teacher的bean。

方式二:构造器注入

构造器注入,就是在构造器里面注入依赖对象。其实就跟属性注入差不多,定义一个有参构造器,然后配置xml文件就行了。

package com.zhizhi;

public class Programmer {
    private Computer computer;

    public Programmer(Computer computer) {
        this.computer = computer;
    }
}

package com.zhizhi;

public class Computer {

    private String color;
    private String brand;
    private String size;

    public Computer(String color, String brand, String size) {
        this.color = color;
        this.brand = brand;
        this.size = size;
    }
}


<?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="student" class="com.zhizhi.Student">
        <property name="name" value="郭郭"></property>
        <property name="sex" value="男"></property>
        <property name="teacher" ref="teacher"></property>

    </bean>

    <bean id="teacher" class="com.zhizhi.Teacher">
        <property name="name" value="智智"></property>
        <property name="clazz" value="二班"></property>
    </bean>

    <bean id="programmer" class="com.zhizhi.Programmer">
        <constructor-arg ref="computer"></constructor-arg>
    </bean>

    <bean id="computer" class="com.zhizhi.Computer">
        <constructor-arg value="联想"></constructor-arg>
        <constructor-arg value="红色"></constructor-arg>
        <constructor-arg value="15.6英寸"></constructor-arg>
    </bean>

</beans>

如何选择注入·:
一般来说,有强依赖关系的就用构造器注入,其他是可选属性的就用属性注入,不过,现在大部分都是用自动装配。

方式三:自动装配方式

package com.zhizhi;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Pop {
    @Autowired
    Com com;
}

package com.zhizhi;

import org.springframework.stereotype.Component;



@Component
public class Com {
    private String brand;
    private String color;
    private String size;
}

<?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/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
       
         <context:component-scan base-pakage="com.zhizhi"/>
</beans>

关键点:在类前面加注解,@Component,在需要注入的类里面加注解:@Autowired,这样xml里面的自动扫描就会扫描到这些加了注解的类和属性,在实例化bean的时候,Spring容器会把加了@Component的类实例化,在实际运行时,会给加了@Autowired的属性注入对应的实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值