Spring笔记01

Spring笔记第一章

  • 1.Spring简介
    • 1.1 Spring介绍
    • 1.2 Spring作用
    • 1.3常见模块
    • 1.4 core - 核心模块
  • 2.Spring之IOC
    • 2.1IOC是什么?
    • 2.2DI是什么?
    • 2.3IOC使用
  • 3Bean标签详解
    • 3.1Bean标签里四个属性的作用:
  • 4spring创建对象的四种方式?
    • 4.1用无参构造方法创建
    • 4.2用带参的构造方法创建对象
    • 4.3用带参的构造方法创建对象
    • 4.4用非静态工厂创建对象
  • 5.依赖注入
    • 5.1 调用set方法注入
    • 5.2 调用带参的构造方法注入
    • 5.3P命名空间注入(本质依旧是set注入语法简洁一些)
    • 5.4 Spel表达式注入
  • 6 复杂类型的注入
    • 6.1注入对象
    • 6.2 注入数组
    • 6.3注入集合
    • 6.4 注入map

1.Spring简介

1.1 Spring介绍

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
Spring是一个非常活跃的开源框架, 基于IOC和AOP来构架多层JavaEE系统,以帮助分离项目组件之间的依赖关系。
它的主要目地是简化企业开发。
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
高内聚低耦合!!!

1.2 Spring作用

1)IOC思想 方便解耦,简化开发:Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring容器管理!
2)AOP 编程(面向切面编程)的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能!
3)声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程SSM SSS SSH
4)方便程序的测试:Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序Spring-test :Spring的测试模块!

方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz(定时任务)等)的直接支持 Spring框架可以无缝整合其他的框架:MyBatis、Hibernate、Redis、Activiti、SpringMVC、SpringDATA。。。
只要是框架,那么Spring就可以管理!
降低 JavaEE API 的使用难度:Spring对 JavaEE 开发中非常难用的API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低

1.3常见模块

20多个子模块,模块按组7大块,核心容器、数据访问/集成,Web,AOP(面向切面编程)、设备、消息和测试

1.4 core - 核心模块

  • spring-core:依赖注入IoC与DI的最基本实现
  • spring-beans:Bean工厂与bean的装配
  • spring-context:spring的context上下文即IoC容器
  • spring-context-support
  • spring-expression:spring表达式语言

2.Spring之IOC

2.1IOC是什么?

控制反转,调用者的实例创建不再由调用者自己创建,而是由spring容器创建,这个过程把实例创建的控制权由应用代码转移到了外部容器,控制权发生了改变。

2.2DI是什么?

依赖注入,给对象赋属性值,一定要保留空的构造方法和get/set的方法!

2.3IOC使用

创建web项目项目名: spring-01-IOC
引入jar包
如果练习IOC ,需要引入 org.springframework.beans , org.springframework.context jar包位置!
Spring下载文件中/libs文件下!: beans,context,core,context-support,spring-expression.Maven项目,pom.xml添加一下内容:
Pom.xml:

 <dependencies>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>4.3.7.RELEASE</version> 
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>4.3.7.RELEASE</version> 
  </dependency> 
  <dependency>
   <groupId>org.springframework</groupId> 
   <artifactId>spring-beans</artifactId>   
   <version>4.3.7.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version>4.3.7.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId> 
   <artifactId>spring-expression</artifactId>
   <version>4.3.7.RELEASE</version> 
 </dependency> 
 <dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.14</version> 
 </dependency>  
</dependencies>

引入log4j.properties文件位置:src目录下maven项目:resources目录下

#log4J日志框架的配置文件 文件名字不能改
#DEBUG 表示日志的级别  调试
#Console 日志打印在控制台
log4j.rootLogger=INFO, Console 
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  
#哪些日志需要打印
log4j.logger.java.sql.ResultSet=INFO  
log4j.logger.org.apache=INFO  
log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG 

创建一个操作类

/** 
@ClassName: Person 
@author: BRUCELIU
@date: 2018年9月17日 下午9:47:54
@Description:TODO /
 public class Person { 
 	private String name;
 	private Integer age; 
 	public Person() {
 	System.out.println("------------> Person.Person");
 }

创建配置文件
建议命名: applicationContext.xml
建议位置: 普通项目src下 / maven项目 resources下

<?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"> 	
<!-- id 和 name 可以同时存在,作为bean的标识 class添加的应该是class的全路径 -->
<bean id="personId" name="personName" class="com.bruceliu.bean.Person" /> 
</beans>

测试用例

public class TestSpring {
 @Test
 public void test1() {	
 //启动加载配置文件,并启动Spring框架
 ApplicationContext applicationContext = 
 		new ClassPathXmlApplicationContext("applicationContext.xml");	
 // getBean 可以使用配置文件中的id值,也可以使用配置文件的name值.	
 Person person = applicationContext.getBean("p1",Person.class);
	 System.out.println("person = " + p);
 }

3Bean标签详解

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

  1. Name属性:给对象取名,名字可以同时取多个,但是不同的对象不能重复
  2. Scope对象作用域属性:
    1)scope = “singleton” 默认值,Spring容器默认创建的对象是单例!
    2)scope=“prototype” 创建的对象是多例(每次使用对象的时候额外创建一个新的
    3)scope=“session” 表示在一次会话范围内,Spring容器中的对象保持一个,公用同一个!
    4)scope=“request” 表示在一次请求范围内,Spring容器中的对象保持一个,公用同一个
    注意:后两个只能用在web项目里
  3. 对象懒创建
    (只有在scope = "singleton"才会生效)
    lazy-init表示对象的加载时机(true:懒加载(使用对象的时候才创建);
    false(spring框架一启动就加载))
  4. 对象创建完成后调用的方法,和对象销毁后调用的方法
    init-method=“对象创建完成后调用的方法”
    destroy-method=“对象销毁后调用的方法”

4spring创建对象的四种方式?

4.1用无参构造方法创建

<!--方式1:无参构造方法创建对象-->
 <bean id="p1" name="person1,person2" class="com.swjd.bean.Person"
  scope="singleton" lazy-init="true" 
  init-method="init" destroy-method="destroy">
   <property name="id" value="957"></property>
     <property name="name" value="貂蝉"></property>
     <property name="sex" value="女"></property>
  </bean>

4.2用带参的构造方法创建对象

<!--方式2:用带参的构造方法创建对象-->
<bean id="p3" class="com.swjd.bean.Person">
    <constructor-arg index="0" type="int" value="9528"></constructor-arg>
    <constructor-arg index="1" type="java.lang.String" value="德玛西亚"></constructor-arg>
    <constructor-arg index="2" type="java.lang.String" value="男"></constructor-arg>
</bean>

4.3用带参的构造方法创建对象

<!--方式3:用静态工厂创建对象-->
<bean id="p4" class="com.swjd.beanfactory.PersonFactory" 
factory-method="createPerson"></bean>

4.4用非静态工厂创建对象

<!--方式4:用非静态工厂创建对象-->
<bean id="noStaticfactory" class="com.swjd.beanfactory.NoStaticPersonFactory"></bean>
<bean id="p5" factory-bean="noStaticfactory" factory-method="createPerson"></bean>

5.依赖注入

5.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>

5.2 调用带参的构造方法注入

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

5.3P命名空间注入(本质依旧是set注入语法简洁一些)

<bean id="m3" class="com.swjd.bean.Man" p:id="3" p:name="八戒" 
p:age="108" p:dog-ref="d1"></bean>

5.4 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>

6 复杂类型的注入

6.1注入对象

6.2 注入数组

<property name="hobbies" >
        <array>
            <value>123</value>
            <value>123</value>
        </array>
    </property>

6.3注入集合

<property name="subject"> 
 List:
   </property>
        <list>
            <value>1234</value>
            <value>1234</value>
        </list>
    </property>
 Set:
  <property name="boyFriends">
        <set>
            <value>12345</value>
            <value>12345</value>
        </set>
    </property>

6.4 注入map

 <property name="map">
        <map>
            <entry key="cn" value="中国"/>
            <entry key="ru" value="俄罗斯"/>
        </map>
    </property>

你可能感兴趣的:(Spring笔记01)