spring基础-day01

Web层(表现层)
​ SpringMVC
​ Struts2
Service层(业务层)
​ Spring
Dao层(持久层)
​ JdbcTemplae(Spring)
​ MyBatis
​ Hibernate/Jpa/SpringDataJpa
Spring框架在JavaEE的三层架构中都可以完成对应功能开发!!
spring又可分为7大模块:

  1. Spring Core (IOC容器):创建对象,给对象属性赋值 ***
    2)Spring AOP(面向切面编程): 事务管理,自定义AOP编程 ***
    3)Spring ORM :Spring整合ORM框架(Hibernate/JPA)*
  2. Spring JDBC : 提供JdbcTemplate的,对Jdbc简单封装 *
    5)Spring Web: Spring整合Web(Servlet,Filter)*
    6)SpringMVC:Spring提供MVC表现层模块 ***
    7)Spring Context: 国际化,事件驱动编程

IOC容器的好处: 解耦!!!

2,程序中解耦应用-控制反转

什么是IOC和DI?,
IOC,Inverse Of Control 控制反转,把创建对象的权力,由自己创建(new)改为工厂来创建。解决创建对象的耦合问题!
DI,Denpedency Injection 依赖注入,把对象属性赋值的权力,由自己完成改为工厂来完成。解决给对象属性赋值的耦合问题!

bean标签配置细节

  1. id: 给创建的对象一个别名(必须唯一的) (推荐使用)
    2) class: 需要创建类的全名(注意必须是类的全名)
    3) name: 给创建的对象创建多个别名,别名之间使用,逗号隔开
    4) scope: 创建对象的作用域,创建单例对象还是多例对象
    singleton: 单例的,默认值。每次调用getBean方法获取的对象都是同一个!
    prototype: 多例的。每次调用getBean方法都会创建一个新的对象!
    request: web中使用。每个用户的请求都会创建一个新的对象!
    session: web中使用。每个session会话中都会创建一个新的对象!
    glbalsession: web中使用。在web集群环境中使用,在同一个集群环境下,只会有一个对象!
    5)lazy-init: 是否延迟创建对象。
    false: 不延迟,默认值。在创建IOC容器的时候,就会根据bean配置创建好对象,等待程序来获取
    true: 延迟。在创建IOC容器的时候,先不创建对象,等到程序来获取(getBean)的时候再创建对象
    6) init-method和destroy-method: 对象的生命周期方法(要在实体类上也创建相应的方法)
    init-method: 初始化方法。在创建完对象后立即调用init-method
    destroy-method: 销毁方法。在销毁对象之前调用destroy-method

创建容器的三种方式:

1,绝对路径(从根目录)
2,相对路径(从项目src目录开始查询)
3,使用类路径方式: 项目的类路径,就是在resources目录下 (推荐使用)

SpringIOC容器创建对象的三种方式:

方式1:默认无参数构造函数创建对象(推荐方式)
方式2:工厂类的静态方法创建对象
方式3:工厂类的实例方法创建对象

<?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">


    <!--
       IOC容器创建对象的三种方式
     -->
    <!-- 1. 默认无参的构造方式
        注意:需要创建的对象必须提供无参构造方式
    -->
   <!-- <bean id="person" class="com.huihui.pojo.Person"/>-->

    <!-- 2.工厂类的静态方法 -->
    <!--
       底层: Person person = PersonFactory.getPersonByStatic();

       class: 工厂类的全名
       factory-method: 工厂类的一个静态方法名称
     -->
    <!--<bean id="person" class="com.huihui.pojo.PersonFactory" factory-method="getPersonByStatic"></bean>-->

    <!-- 3. 工厂类的实例方法 -->
    <!--
       底层:
           PersonFactory factory = new PersonFactory();
           Person person = factory.getPerson();
     -->
    <!-- 3.1 先创建工厂类对象 -->
    <bean id="factory" class="com.huihui.pojo.PersonFactory"/>
    <!-- 3.2 使用工厂对象调用实例发方法
            factory-bean: 创建工厂对象的id
            factory-method: 工厂类的实例方法
    -->
    <bean id="person" factory-bean="factory" factory-method="getPerson"/>
     
</beans>

SpringIOC容器依赖注入

DI, 依赖注入,关注的就是怎么给对象的属性去赋值!
1:构造器赋值: 依赖注入:给对象属性赋值

1. 带参数的构造方式

  constructor-arg 标签的使用
    1)value: 需要传递的参数值(仅限基本类型)
    2) index: 参数的索引号,从0开始,不写index,按照配置从下往下的顺序加载
    3) name: 指定方法的形参名称来进行赋值, 不写,就自动匹配形式参数名称
    4)type: 指定方法的参数类型赋值, 默认不写就是String类型
    5) ref: 引用类型,引用IOC容器的另一个bean(对象)
        注意:value和ref只能使用其中一个

2 :使用setter方法注入

   property: 通过调用setter进行赋值
   name: setter方法名称。去掉set,把首字母小写

<bean id="person" class="com.huihui.pojo.Person">
    <property name="id" value="666"/>
    <property name="username" ref="str"/>
</bean>

3:p命名空间
先导入p名称空间,然后再在bean.xml
<bean id = "".....................p:id="999" p:username-ref="str"/>

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 *
 */
public class Person {

    //定义属性
    private int id;
    private String username;
    private String sex;

    public Person(){
        System.out.println("创建Person对象!!");
    }


    //方式一:使用带参数的构造方式进行属性的依赖注入
    public Person(int id,String username){
        this.id = id;
        this.username = username;

    }
    public Person(String sex,String username){
        this.sex = sex;
        this.username = username;
    }

    //方式二:使用setter方法对属性辅助
    public void setId(int id) {
        System.out.println("调研Person的setId");
        this.id = id;
    }

    public void setUsername(String username) {
        System.out.println("调研Person的setUsername");
        this.username = username;
    }

    //集合类型
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;
    private String[] array;
    private Properties properties;


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

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setArray(String[] array) {
        this.array = array;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2.1 我们的理念是:让别人为你服务 IoC是随着近年来轻量级容器(Lightweight Container)的...
    好好学习Sun阅读 2,746评论 0 11
  • 参考W3C Spring教程 Spring致力于J2EE应用的各种解决方案,而不仅仅专注于某一层解决方案。可以说S...
    王侦阅读 1,187评论 0 6
  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 6,952评论 4 21
  • 最近想系统的学习一下Spring的相关知识,在这里分享一下。也希望能帮助那些对英文技术文档阅读比较困难的朋友。接下...
    Aiibai阅读 1,584评论 5 16
  • 陳皮好處很多人都不知道,為何不同年份就不同價錢,因效果不一樣,我們常買都要五年才合適,保存好多買些放上三年,這些陳...
    Daniel均衡阅读 184评论 0 0