Spring学习笔记一:Spring框架搭建、配置详解,IOC控制反转、依赖注入详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33322074/article/details/89297325

1. Spring学习笔记一:Spring框架搭建、配置详解

1.1. Spring框架介绍

  1. 三种框架中spring的位置,框架中分三层,web层、service层、dao层,Struts2位于web层,Hibernate位于dao层,那么Spring框架应该在那个层呢?其实Spring框架贯穿三个层次,Spring负责管理项目中的所有对象,spring看做是项目中对象的管家。

spring框架所处位置

  1. spring是一站式框架:正是因为spring框架属于容器性质决定的,容器中装什么对象就有什么功能,不仅不排斥其他框架,还能帮其他框架管理对象。aop支持,IOC思想,支持junit等。

1.2. spring框架的搭建

1.2.1. 导包

四个核心包:bean,core,context,expression

以及一个日志包:commons.logging,

老版本需要导入:log4j

1.2.2. 创建对象
1.2.3. 配置注册对象到容器
  1. 创建Spring配置文件,位置任意,建议放在src下,名字任意,建议applicationContext.xml

  2. eclipse导入约束

  • window–>preference(偏好)–>XML catalog–>Add–>G:\TheJarPackage\spring-framework-4.2.4.RELEASE\schema\beans(这个是里面的最新版本约束)

schema约束

  • key type选择Schema location
  • key键最后要加上/spring-beans-4.2.xsd
  • Schema约束算是导入完成。
1.2.4. 配置applicationContext.xml
  1. 添加<bean></bean> 进入design,
  2. 选中右键,选择Edit NameSpace,
  3. 添加xsi
  4. 再Add,勾选Specify New Namespace
  5. 选择第三个,点击browse,选择Select XML Catalog entry,并从中找到spring-bean-4.2.xsd
  6. 然后配置Namespace Name选项,即Spring-bean-4.2.xsd的前缀

xml文件添加约束

  1. 如果在applicationContext.xml中添加<出现提示表示配置成功。

1.3. IOC控制反转和DI依赖注入

  1. IOC即:inverse of control 就是将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入,引入spring以后,这些东西都交给了spring来创建注入。
  2. DI即:Dependency Injection依赖注入。实现IOC思想需要DI的支持。spring创建这个类的过程中,spring将类的依赖的属性设置进去。

1.4. applicationContext.xml配置详解

  1. 每次启动时就会创建容器中配置的所有对象,并提供更多的功能。
  2. 丛类路径下加载配置文件:ClassPathXmlApplicationContext
  3. bean元素配置
<!-- 将User对象交给spring容器管理 -->
<!-- Bean元素:使用该元素描述需要spring容器管理的对象
   class属性:被管理对象的完整类名.
   name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象.  
     可以重复.可以使用特殊字符.
   id属性: 与name属性一模一样. 
     名称不可重复.不能使用特殊字符.
   结论: 尽量使用name属性.
   -->
<bean  name="user" class="cn.zhang.bean.User" ></bean>
<!-- 导入其他spring配置文件 -->
<import resource="cn/zhang/b_create/applicationContext.xml"/>
  1. spring创建对象方式
  • 空参构造方式
<bean  name="user" class="cn.it.bean.User"</bean>
  • 静态工厂方式创建(了解)
<bean  name="user2" 
		class="cn.it.b_create.UserFactory" 
		factory-method="createUser" ></bean>
public static User createUser(){
    System.out.println("静态工厂创建User");
    return new User();
}
  • 实例工厂创建(了解)
<!-- 创建方式3:实例工厂创建 
   调用UserFactory对象的createUser2方法创建名为user3的对象.放入容器
  -->
<bean  name="user3" 
      factory-bean="userFactory"<!-- 这个userFactory和下面的name值要一致 -->
      factory-method="createUser2" ></bean>
<bean  name="userFactory" 
      class="cn.it.b_create.UserFactory"   ></bean>

1.5. bean属性scope

  1. scope属性有:singleton单例,prototype多例,request,session最后两个不常见。
  • singleton(默认值):单例对象.被标识为单例的对象在spring容器中只会存在一个实例
  • prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的.对于Struts2中的Action每次请求都会创建一个Action。
  • request:web环境下.对象与request生命周期一致.
  • session:web环境下,对象与session生命周期一致.

1.6. bean属性生命周期属性

  1. 在bean中配置init-method=“初始化方法”,destory-method=“销毁方法”。
  2. 初始化方法,销毁方法都是放在对象中的,spring会在创建对象后立即调用初始化方法,spring会在关闭或销毁所有容器中的对象之前调用销毁方法。
  3. bean即一个容器。

1.7. spring的分模块配置

  1. 就是在spring的一个配置中导入其他配置文件
<!-- 导入其他spring配置文件 -->
<import resource="cn/zhang/b_create/applicationContext.xml"/>

1.8. spring属性注入

  1. set方法注入
<!-- set方式注入: -->
<bean  name="user" class="cn.it.bean.User" >
    <!--值类型注入: 为User对象中名为name的属性注入tom作为值 -->
    <property name="name" value="tom" ></property>
    <property name="age"  value="18" ></property>
    <!-- 引用类型注入: 为car属性注入下方配置的car对象 -->
    <property name="car"  ref="car" ></property>
</bean>

<!-- 将car对象配置到容器中 -->
<bean name="car" class="cn.it.bean.Car" >
    <property name="name" value="兰博基尼" ></property>
    <property name="color" value="黄色" ></property>
</bean>
  1. 构造函数注入
<!-- 构造函数注入 -->
<bean name="user2" class="cn.it.bean.User" >
    <!-- name属性: 构造函数的参数名 -->
    <!-- index属性: 构造函数的参数索引 -->
    <!-- type属性: 构造函数的参数类型-->
    <constructor-arg name="name" index="0" type="java.lang.Integer" value="999"  ></constructor-arg>
    <constructor-arg name="car" ref="car" index="1" ></constructor-arg>
</bean>
  • name,index,type三者能确定任何一个构造函数。
  1. p名称空间注入(不常用)
<!-- p名称空间注入, 走set方法
	1.导入P名称空间  xmlns:p="http://www.springframework.org/schema/p"
	2.使用p:属性完成注入
		|-值类型: p:属性名="值"
		|-对象类型: p:属性名-ref="bean名称"
 -->
	<bean  name="user3" class="cn.it.bean.User" p:name="jack" p:age="20" p:car-ref="car"  >
	</bean>
  1. spel注入(不常用)
<!-- 
	spel注入: spring Expression Language sping表达式语言
 -->
<bean  name="user4" class="cn.it.bean.User" >
		<property name="name" value="#{user.name}" ></property>
		<property name="age" value="#{user3.age}" ></property>
		<property name="car" ref="car" ></property>
</bean>

1.9. 复杂类型注入

  1. 数组类型注入
<!-- 如果数组中只准备注入一个值(对象),直接使用value|ref即可 
 <property name="arr" value="tom" ></property>
 -->
<!-- array注入,多个元素注入 -->
<property name="arr">
    <array>
        <value>tom</value>
        <value>jerry</value>
        <ref bean="user4" />
    </array>
</property>
  1. list集合类型注入
<!-- 如果List中只准备注入一个值(对象),直接使用value|ref即可 
 <property name="list" value="jack" ></property>-->
<property name="list"  >
    <list>
        <value>jack</value>
        <value>rose</value>
        <ref bean="user3" />
    </list>
</property>
  1. Map集合类型注入
<!-- map类型注入 -->
<property name="map"  >
    <map>
        <entry key="url" value="jdbc:mysql:///crm" ></entry>
        <entry key="user" value-ref="user4"  ></entry>
        <entry key-ref="user3" value-ref="user2"  ></entry>
    </map> 
</property>
  1. properties类型注入
<!-- prperties 类型注入 -->
<property name="prop"  >
    <props>
        <prop key="driverClass">com.jdbc.mysql.Driver</prop>
        <prop key="userName">root</prop>
        <prop key="password">1234</prop>
    </props>
</property>

猜你喜欢

转载自blog.csdn.net/qq_33322074/article/details/89297325