(一)Spring介绍

1、概念

Spring是开源的轻量级框架,轻量级的意思就是不需要依赖额外的东西;
Spring是一站式框架,提供了3层的功能(web层、server层、dao层),每一层都提供了解决方案;
他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。

2、Spring中重要的部分

(1)Ioc:控制反转。把创建对象的权利交给Spring框架,这是框架的重要特征。控制反转包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。传统模式下,当一个角色需要另一个角色帮助时,通常是由调用者去创建被调用者的对象,在spring中,创建被调用者对象到工作由spring容器来完成,这叫做控制反转,然后将被调用者的对象注入到调用者,被称作依赖注入
(2)Aop:面向切面编程,扩展功能不需要源代码

3、Spring Ioc的操作方式

(1) Spring ioc :将创建对象的工作交给spring 管理
(2) Ioc操作方式分两部分:

  • 配置文件方式(xml)
  • 注解方式

4、Spring Ioc的实现原理

(1) 我们要利用一个User类的show方法的时候,我们通常是创建这个类的对象,然后调用它的方法。如下图:
最简单写法
这样做的缺点:就是两个类耦合度太高。

(2) 好一点的做法就是利用工厂设计模式。目的还是利用一个类(被使用类)的方法。此时,创建对象的工作不放在使用(把使用其他类的对象的类叫做使用类)中,即使用类不直接创建对象,创建对象的工作交给工厂类,然后,使用类 用 工厂类 来获取被使用类 的 对象。如下图:
工厂
这样的优点:就是低耦合,高内聚。

(3) Spring 是如何实现的?如下图:
Spring原理
解释:
I. 先创建User类,声明一个方法。
II. 在XML中,将要创建对象的类配置在里面
III. Spring采用工厂模式创建对象,这是透明的。
IV. 在UserServlet中通过Sprig把对象注入。

5、Spring 的bean管理(xml)

(1)使用无参构造函数创建对象(即调用com.zb_01包里的User类的默认构造函数)(最常用)

<bean id="user" class="com.zb_01.User"/>

(2)使用静态工厂类中的方法创建对象(不常用)

<bean id = "user1" class = "com.zb_02.UserFactory" factory-method="getUser"/>

详细解释:利用UserFactory这个工厂类中的静态的getUser方法来创建对象。附上工厂类代码:

package com.zb_02;
import com.zb_01.User;
public class UserFactory {

    public static User getUser() {
        return new User();
    }
}

在静态工厂类中可以写很多静态方法来创建类对象。

(3)使用实例工厂类中的方法创建对象(不常用)

<bean id = "factory" class="com.zb_02.UserFactory2"/> 
<bean id = "user2" factory-bean="factory" factory-method="getUser"/>

详细解释:先创建一个实例工厂对象;然后利用这个对象的getUser方法去创建User。附上工厂类代码:

import com.zb_01.User;

public class UserFactory2 {

    public User getUser() {
        return new User();
    }
}

静态工厂和实例工厂的区别:
I. 因为静态工厂中的方法是静态的,所以可以直接用类名加方法名去访问方法
II. 实例工厂不能用类名加方法名去访问方法,必须用对象去调用方法,所以得先创建对象,然后再利用该对象去调用方法来创建User

6、Bean标签中的属性

(1)id,name 的功能是一样的,即“对象名”的意思。 name现在不用了(为struts1设计的)id不能重复
(2)scope :设置类的特点(singleton 单例,默认值;prototype:多例)
(3)class:类的全路径名字

7、在Bean中给类中的属性注入值(基本类型的属性)

(1)利用有参构造函数

<bean id ="student" class="com.zb_03.Student">
     <constructor-arg name="name" value="zhangsan"/>
</bean>

附上类代码:

public class Student {

    private String name;
    private String address;

    public Student(String name) {
        this.name = name;
    }
    public void show() {
        System.out.println("111");
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

详细解释:标签中的属性name的值是类中构造函数的参数名,value就是值。
(2)利用set函数(类代码同上)
详细解释:因为类中属性name是用构造函数赋值的,所以它的赋值方式是用
类中属性address是有set方法的,所以它的赋值方式是用,其中标签中的属性name的值是类中的属 性名字,value是值。

8、给类中对象类型的属性注入值

类代码很容易想,就是一个类中的属性是另外一个类的对象;
假设一个UserDao类和一个UserServise类,后者属性里面有前者的对象,并且有set方法。代码如下:

<bean id="userDao" class="com.zb_04.UserDao"/>
<bean id="userService" class="com.zb_04.UserService">
    <property name="dao" ref="userDao"/>
</bean>

9、P命名空间注入

首先要在命名空间中添加如下代码:

xmlns:p="http://www.springframework.org/schema/p"

然后

<!-- p命名空间 -->
<bean id = "person" class="com.zb_04.Person" p:name="李四"/>

10、给类中复杂属性赋值(集合类型)

<bean id="demo" class="com.zb_05.Demo">

    <!-- 数组 -->
        <property name="arr">
            <list>
                <value>小王</value>
                <value>小李</value>
                <value>小张</value>
                <value>小孙</value>
                <value>小乱网吧打</value>
            </list>
        </property>

    <!-- list -->
        <property name="list">
            <list>
                <value>da王</value>
                <value>da李</value>
                <value>da张</value>
                <value>da孙</value>
                <value>da乱网吧打</value>
            </list>
        </property>

    <!-- map -->    
        <property name="map">
            <map>
                <entry key="文章" value="马伊琍"></entry>
                <entry key="kobe" value="瓦妮莎"></entry>
                <entry key="aaa" value="大傻逼"></entry>
            </map>
        </property>

    <!-- properties  不保证顺序 -->  
        <property name="properties">
            <props>
                <prop key="a">l</prop>
                <prop key="b">o</prop>
                <prop key="c">v</prop>
                <prop key="d">e</prop>
            </props>
        </property>
    </bean> 

11、如何获取从Spring对象中获取对象(举一个简单的例子)

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    private static ApplicationContext context;

    public static void main(String[] args) {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //创建对象
        [类名] 对象名 = (强制转换) context.getBean("bean的id名");
        对象.方法();
    }
}

12、Spring与web整合原理

  • 加载核心配置文件(即管理bean的文件,文件名字通常叫做applicaitonContext.xml)时,用new,效率很低

  • 实现思想:把加载配置文件和创建对象的过程,在服务器启动时完成

  • 实现原理:
    • 在服务器启动的时候,为每个项目创建一个ServletContext对象
    • ServletContext对象创建的时候,使用监听器监听到ServletContext对象在什么时候创建
    • 当监听器监听到ServletContext对象创建的时候,加载配置文件,把配置文件中配置的对象创建,并放置到ServletContext对象中(setAttribute())
    • 获取对象(getAttribute())

13、注解方式配置Bean(简单介绍,以后再补充)

(1) 利用注解创建对象(直接贴代码)

import org.springframework.stereotype.Component;

@Component(value="dao12")
public class StudentDao {

    public void test() {
        System.out.println("dao...");
    }
}

使用方法与在xml中配置是一样的。

(2)利用注解给属性注入值(利用到了上面的StudentDao对象 dao12)

import javax.annotation.Resource;
import org.springframework.stereotype.Service;


@Service(value="service")
public class StudentService {


//  @Autowired  //自动装载,与要装配的名字无关  按类型装配
//  private StudentDao dao;

    @Resource(name="dao12")//要加name属性
    private StudentDao dao1;

    public void test() {
        System.out.println("service...");
        dao1.test();
    }
}

@AutoWired 与 @Resource 的区别:
I. @Autowired与@Resource都可以用来装配bean.都可以写在字段上,或写在setter方法上。
II. @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=”false”),如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

@Autowired() @Qualifier("baseDao")     
private UserDao UserDao;

III. @Resource,默认按照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在set方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="UserDao")     
private UserDao UserDao;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值