Spring学习

Spring简介

spring是一个从实际开发中抽取出来的框架,为企业开发提供一个轻量级的解决方案。解决方案包括了:基于依赖注入(Dependency Injection)的核心机制、基于AOP(面向切面编程)的声明式事务管理、与多种持久层计数的整合,以及优秀的WEB MVC框架等。
Spring的有点是:
低侵入式设计
IOC容器降低业务对象替换的复杂性
Spring的ORM(对象关系映射)和DAO提供良好的整合,简化底层数据库的访问。

使用Spring来管理bean

//axe类
public class Axe {
    public String chop(){
        return "使用斧头砍柴";
    }
}
//person类
public class Person {
    private Axe axe;
    public void setAxe(Axe axe){
        this.axe = axe;
    }
    public void useAxe(){
        System.out.println("我打算去砍点柴");
        //调用axe的hop方法
        //表名person依赖与axe对象
        System.out.println(axe.chop());
    }
}
<!--beans.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="person" class="org.crazyit.app.service.Person">
        <property name="axe" ref="axe"/>
    </bean>
    <bean id="axe" class="org.crazyit.app.service.Axe"/>
    <bean id="win" class="javax.swing.JFrame"/>
    <bean id="date" class="java.util.Date"/>
</beans>

配置文件中的<bean>元素默认以反射方式来调用该类无参数的构造器

<bean id="person" class="org.crazyit.app.service.Person"/>
//Spring底层会执行以下格式代码
String idStr="person";//解析<bean../>元素的id属性得到该字符串值
String classStr="org.crazyit.app.service.Person";//解析<bean../>元素class属性得到该字符串值
Class clazz = Class.forName(classStr);
Object obj = clazz.newIntance();//创建一个实例
container.put(idStr,obj);//container代表Spring容器

class属性必须是完整的包名
Spring框架只要看到有<property.. /> 元素,那么就会在底层以反射的方式执行一次setter方法。
=》<bean> Spring调用构造器创建对象 <property>驱动Spring执行setter方法

<bean id="person" class="org.crazyit.app.service.Person">
    <!--控制调用setAxe()方法,将容器里的axe Bean作为参数传入-->
    <property name="axe" ref="axe">
</bean>
//name属性驱动Spring执行setAxe()方法,ref为axe,指定容器中名为axe的Bean作为setter方法传入参数
//底层执行如下代码
String nameStr="axe";//解析<property>元素的name属性
String refStr="axe";//解析<property>元素的axe属性
String setterName="set"+nameStr.substring(0,1).toUpperCase()+nameStr.subString()+nameStr.subString(1);//生成将要setter方法名
//获取Spring容器名为refStr的Bean
Object paramBean=container.get(refStr);
//clazz是前一段得到的Class对象
Method setter=clazz.getMethod(setterName,paramBean.getClass());
setter.invoke(obj,paramBean);

创建spring容器

ApplicationContext ctx = new ClassPathXmlApplicationContext("xx.xml");

spring核心机制:依赖注入

控制反转(Inversion of Control,Ioc)和依赖注入(Dependency Injection)含义相同
调用者无须主动获取被依赖对象,只要被动接受Spring容器为调用者的成员变量赋值即可。调用者从主动的获取(new)变成被动接受(property)——控制反转。
Spring容器将被依赖对象赋值给调用者的成员变量——依赖注入
1.设值注入 2.构造注入

Spring加载resource时的classpath*与classpath

classpath*为了从多个jar文件中加载相同的文件
classpath:只能加载找到的第一个文件
如果resource1.jar中package中一个1.xml,resource2.jar中有一个1.xml,那么classpath*会将这两个xml全部加载,classpath只会加载其中的一个(顺序取决于jar包的加载顺序)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值