Spring基础小白必看(详细笔记)

Spring基础小白必学笔记

一、Spring的作用

学习spring首先要了spring到底是用来做什么的。Spring可以解决业务逻辑层和其他各层的耦合问题,也是一个框架的粘合剂,它让面向接口编程思想贯穿了整个系统,特点:高内聚,低耦合,设计层框架!

主要学习spring的以下部分:

  • IOC思想
  • AOP编程
  • 声明式事务的支持
  • 框架无缝整合其他框架声明式事务的支持

二、主要模块

Spring共有20多个子模块,模块按组7大块,

  1. Spring Core
    框架的最基础部分,提供 IoC 容器,对 bean 进行管理。

  2. Spring Context
    基于 bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。

  3. Spring DAO
    提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。

  4. Spring ORM
    提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate、MyBatis 等。

  5. Spring AOP
    提供了符合AOP Alliance规范的面向方面的编程实现。

  6. Spring Web
    提供了基础的 Web 开发的上下文信息,可与其他 web 进行集成。

  7. Spring Web MVC
    提供了 Web 应用的 Model-View-Controller 全功能实现。

三、IOC是什么

当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可。由此可见,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受。

四、Bean标签里四个属性的作用:

  1. Name属性:给对象取名,名字可以同时取多个,但是不同的对象不能重复

  2. Scope对象作用域属性:
    2.1 scope = “singleton” 默认值,Spring容器默认创建的对象是单例!
    2.2 scope=“prototype” 创建的对象是多例(每次使用对象的时候额外创建一个新的
    2.3 scope=“session” 表示在一次会话范围内,Spring容器中的对象保持一个,公用同一个!
    2.4 scope=“request” 表示在一次请求范围内,Spring容器中的对象保持一个,公用同一个
    注意:后两个只能用在web项目里

  3. 对象懒创建(只有在scope = "singleton"才会生效)
    lazy-init表示对象的加载时机(true:懒加载(使用对象的时候才创建);false(spring框架一启动就加载))

  4. 对象创建完成后调用的方法,和对象销毁后调用的方法
    init-method=“对象创建完成后调用的方法”
    destroy-method=“对象销毁后调用的方法”

五、Spring创建对象的四种方式

  1. 用无参构造方法创建
<!--方式1:无参构造方法创建对象-->
 <bean id="p1" name="person1,person2" class="com.swjd.bean.Person" 
	scope="singleton" lazy-init="true" 
	init-method="init" destroy-method="destroy">
  1. 用带参的构造方法创建对象
<!--方式2:用带参的构造方法创建对象-->
<bean id="p2" class="com.swjd.bean.Person">
    <constructor-arg index="0" type="int" value="9528"/>
    <constructor-arg index="1" type="java.lang.String" 
    value="德玛西亚"/>
    <constructor-arg index="2" type="java.lang.String" value="男"/>
</bean>
  1. 用静态工厂创建对象
<!--方式3:用静态工厂创建对象-->
<bean id="p3" class="com.swjd.beanfactory.PersonFactory" 
factory-method="createPerson"/>

3.1 PersonFactory静态工厂

package com.swjd.beanfactory;

import com.swjd.bean.Person;

public class PersonFactory {
    public static Person createPerson(){
        return new Person(123,"小灰灰","男");
    }
}
  1. 用非静态工厂创建对象
<!--方式4:用非静态工厂创建对象-->
<bean id="noStaticfactory" 
class="com.swjd.beanfactory.NoStaticPersonFactory"/>
<bean id="p4" factory-bean="noStaticfactory" 
factory-method="createPerson"/>

NoStaticPersonFactory 非静态工厂

package com.swjd.beanfactory;

import com.swjd.bean.Person;

public class NoStaticPersonFactory {
    public Person createPerson(){
        return new Person(124,"小香香","女");
    }
}

六、DI是什么

DI便是依赖注入,简单的来说就是给对象赋属性值,一定要保留空的构造方法和get/set的方法!

依赖注入的四种方式

Man实体类

package com.swjd.bean;

public class Man {
    private int id;
    private String name;
    private String hobby;
    //养一只狗
    private Dog dog;

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public Man() {
    }

    public Man(int id, String name, String hobby, Dog dog) {
        this.id = id;
        this.name = name;
        this.hobby = hobby;
        this.dog = dog;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Man{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", hobby='" + hobby + '\'' +
                ", dog=" + dog +
                '}';
    }
}
  1. 调用set方法注入
<bean id="m1" class="com.swjd.bean.Man">
    <!--第一种:依赖注入的方式:set注入-->
    <property name="id" value="1"/>
    <property name="name" value="刘德华"/>
    <property name="age" value="48"/>
   <!-- <property name="dog" ref="d1"/>-->
    <property name="dog">
        <ref bean="d1"/>
    </property>
</bean>
  1. 调用带参的构造方法注入
<bean id="m2" class="com.swjd.bean.Man">
    <!--第二种:依赖注入的方式:带参的构造方法-->
    <constructor-arg index="0" type="int" value="2"/>
    <constructor-arg index="1" type="java.lang.String" value="蔡徐坤"/>
    <constructor-arg index="2" type="int" value="20"/>
    <constructor-arg index="3" type="com.swjd.bean.Dog" ref="d1"/>
</bean>
  1. P命名空间注入(本质依旧是set注入,语法简洁一些)
<bean id="m3" class="com.swjd.bean.Man" p:id="3" 
p:name="八戒" p:age="108" p:dog-ref="d1"/>
  1. Spel表达式注入
<bean id="m4" class="com.swjd.bean.Man">
    <property name="id" value="#{m1.id}"></property>
    <property name="name" value="#{m2.name}"></property>
    <property name="age" value="#{m3.age}"></property>
</bean>

七、复杂类型的注入:

  1. 注入对象
  2. 注入数组
	<property name="hobbies" >
        <array>
            <value>123</value>
            <value>123</value>
        </array>
    </property>
  1. 注入集合
//List:
	<property name="subject">
        <list>
            <value>1234</value>
            <value>1234</value>
        </list>
    </property>


//Set:
 	<property name="boyFriends">
        <set>
            <value>12345</value>
            <value>12345</value>
        </set>
    </property>
  1. 注入map
	<property name="map">
        <map>
            <entry key="cn" value="中国"/>
            <entry key="ru" value="俄罗斯"/>
        </map>
    </property>

八、Spring AOP功能和目标

Spring实现AOP的方法跟其他的框架不同, Spring并不是要尝试提供最完整的AOP实现(尽管SpringAOP有这个能力), 相反的 它其实侧重于提供一种AOP实现和SpringIOC容器的整合.

发布了2 篇原创文章 · 获赞 0 · 访问量 49

猜你喜欢

转载自blog.csdn.net/XIAODENG_/article/details/105307490