框架(SSM)-Spring

1 框架简介

  • 盖房子的时候搭建的架子
  • 自己编码的时候遵循框架的约束即可

2 Java中的框架

2.1 Struct2 Spring Hibernate

2.2 SpringMvc Spring Mybatis

2.3 SpringBoot


3 Spring核心(JavaBean的管理)

3.1 IOC(控制反转)

  • 把对象的创建权交给Spring容器

3.2 DI(依赖注入)

  • 在把对象交给IOC容器的时候,注入对象的属性

3.3 AOP(面向切面编程)

  • 是面向对象的功能延伸.不是替换面向对象,是用来解决OOP(面向对象编程)中一些问题.

4 Spring优点

4.1 方便解耦 简化开发**

把所有对象的创建交给Spring管理

4.2 支持Aop编程

解决在OOP中遇到的一些问题

4.3 声明式事务的支持

4.4 方便调试程序

在spring中有专门的调试模块Spring-Test

4.5 方便集成各种优秀的框架

Spring对各种主流的框架都提供了支持

4.6 Spring对一些比较难用的API都进行了封装,方便了程序猿的使用(邮件 远程调用…)

5 日志框架

**log4j**:开源的优秀的日志框架  --->logback

..........

**日志门面**:运行这些日志系统的

slf4j

logging (apache的日志门面)
Log log4j = Log log4j = LogFactory.getLog(TestLog.class);
log4j.info("info");
log4j.debug("debug");
log4j.error("error");

6 Spring的入门

6.1 pom依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>


<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

6.2 创建log4j的配置文件

log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug, stdout

6.3 创建Spring的配置文件

在resources目录下创建applicationContext.xml

引入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">

    <!--把User叫给Spring来管理-->
    <bean id="user" class="com.uplooking.spring.ops1.User"></bean>
</beans>

6.4 使用ApplicationContext创建对象

  //创建Spring的工厂对象(BeanFactory  AppplicationContext)
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //使用applicationContext.xml中配置的id来获取对象(Spring内部会帮我们创建对象==>IOC)
        User user = (User) applicationContext.getBean("user");
        System.out.println(user);

7 ApplicationContext BeanFactory的区别

  1. ApplicationContext继承自BeanFactory
  2. 在老版本的Spring中使用的是BeanFactory,在新版本的Spring中使用ApplicationContext
  3. BeanFactory会在调用getBean时候实例化对象
  4. ApplicationContext会在容器加载时把Spring容器管理的所有的Bean实例化(仅对scope="singleton"有效)
  5. scope有两个属性值: singleton(单例模式)prototype(多例模式),默认为 singleton(单例模式)

8. bean中的name和id属性

  1. name与id都是用来给Spring管理的对象命名的
  2. id遵循的是xml的规范(唯一)
  3. name可以配置多个(name=“user,user2,user3”)
  4. name可以出现特殊字符,id不能出现特出字符
  5. 一般使用id即可

9 Spring管理对象的创建的方式

9.1 使用构造器创建对象(默认)

class User {  
public User() {
        System.out.println("构造方法...");
    }
}
<!--默认使用无参数的构造器来创建对象的-->
<bean id="user" class="com.uplooking.spring.ops1.User">
</bean>

9.2 使用静态工厂创建对象

public class UserFactory {
    public User static newInstance() {
        return new User();
    }
}
<!--使用静态工厂实例化对象-->
<bean id="user" class="com.uplooking.spring.ops1.UserFactory" factory-method="newInstance"></bean>

9.3 使用实例工厂创建对象

public class UserFactory {
    public User newInstance() {
        return new User();
    }
}
<!--使用实例工厂来创建对象-->
<bean id="userFactory" class="com.uplooking.spring.ops1.UserFactory"></bean>
<bean id="user" factory-bean="userFactory" factory-method="newInstance"></bean>

注意:

使用静态工厂创建对象时,工厂方法必须是static静态的;

使用实例工厂创建对象时,工厂方法不能是静态的


10. 属性的注入(DI)

DI:依赖注入==>在对象的创建过程中给属性赋值

  • 用构造器注入
<!--使用构造器注入属性-->
<constructor-arg name="name" value="小花"></constructor-arg>
<constructor-arg name="age" value="23"></constructor-arg>
  • 用setter方法注入
<!--setter方法注入 property的name属性值为: setter方法的名字的首字母小写-->
<property name="name" value="admin"></property>
<property name="userDao" ref="userDao"></property>

在实际开发过程中推荐使用setter方法注入的方式


11. IOC与DI的区别

IOC:把对象的创建权交给Spring容器

DI:创建对象时注入对象的属性

面试题: IOC与DI有什么区别?

IOC: 对象的创建权交给Spring,Spring的容器来管理这些对象

DI: 依赖注入; 在Spring创建对象的过程中注入对象的属性;


12. Bean的作用范围

scope="singleton" 全局创建一个实例

scope="prototype" 当ApplicationContext调用getBean()时,创建对象,每调用一次创建一个对象

13. Bean的初始化和销毁

public class User {
    public void init() {
        System.out.println("初始化方法...init()");
    }

    public void destory() {
        System.out.println("销毁方法....destory()");
    }
<bean id="user" class="com.xzy.spring.ops1.User" scope="singleton" init-method="init" destroy-method="destory"/>
/*容器创建时,会创建配置的Bean的对象,并且执行init()方法,*/
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
/*Spring容器关闭时执行销毁的方法*/
applicationContext.close();

14. Bean的生命周期(了解)

  1. instantiate bean对象实例化(如果scope="singleton"时,在容器加载时创建实例)
  2. 封装属性(DI)调用setter方法
  3. 如果存在类实现 BeanPostProcessor(初始化之前执行) ,执行postProcessBeforeInitialization(aop的底层)
  4. 调用 指定初始化方法 init
  5. 如果存在类实现 BeanPostProcessor(初始化之后执行) ,执行postProcessAfterInitialization
  6. 配置了 ,指定销毁方法

15 DI的复杂属性的注入

15.1 普通的字面量的注入

<bean id="user" class="com.uplooking.spring.ops1.User"/>  
<property name="name" value="小花"/>
<property name="age" value="23"/>
</bean>

15.2 对象注入

<bean id="orders" class="com.uplooking.spring.ops1.Orders">
            <!--对象的注入-->
             <property name="user" ref="user"/>
</bean>

15.3 Map的注入

<bean id="user" class="com.uplooking.spring.ops1.User">
    <property name="name" value="小花花"></property>
    <property name="age" value="17"></property>
    <property name="map">
        <map>
            <entry key="k1" value="v1"/>
            <entry key="k2" value="v2"/>
            <entry key="k3" value="v3"/>
        </map>
    </property>
</bean>

15.4 List的注入

<bean id="user" class="com.uplooking.spring.ops1.User">
    <property name="name" value="小花花"></property>
    <property name="age" value="17"></property>
    <property name="loves">
        <list>
            <value>java</value>
            <value>c++</value>
            <value>c</value>
        </list>
    </property>
</bean>

15.5 List中存放对象

<bean id="orders" class="com.uplooking.spring.ops1.Orders">
</bean>
<bean id="user" class="com.uplooking.spring.ops1.User">
    <property name="ordersList">
        <list>
            <ref bean="orders"/>
        </list>
    </property>
</bean>

16. 小作业

把图书管理系统中的对象用Spring来管理;

Spring管理哪些对象?

  • service
  • dao

Spring的容器ApplicationContext单例的吗?---->监听器(ApplicationContext)

  • 单例

service层和dao层的对象是单例的?

  • 单例
上一篇:TypeError: A string has ambiguous TensorShape, please wrap in a list or convert to an int: hidden_di


下一篇:android Immutable bitmap passed to Canvas constructor异常