Spring框架的介绍、搭建、配置详解和注解

Spring框架的介绍

1. spring框架的作用

 

Spring框架是一个一站式框架(一步就到位 j2ee 三层开发(web service dao)spring框架全部解决)。Spring本身就有这三层对应的功能 web:springMVC springBoot  service spring  dao : spring 整合了jdbc。spring本身是一个容器,放了什么对象就拥有了对象的功能。Hibernate和struts2 都可以放到这个容器里面。

Spring的优点

   简化软件开发的复杂性:

(1)IOC(Inversion of Control) 控制反转

(2)AOP(Aspect Oriented Programming)思维

(3)不仅不排斥其他的框架,并且帮助其他框架管理对象

(4)整合了jdbc spring jdbc

(5)aop 事务

(6)junit 单元测试

Spring框架的搭建

1. 导包

 

spring-3.0.2 spring框架整合的其他jar包 当年市面上所有的包

spring-5.0.2 spring框架本身的包

打开对应spring框架包之后

libs:jar包 

schema:约束文件,spring框架约束文件有很多

 

Spring框架将功能进行了分层

Data...:dao层的功能

Web : 对应的是web层的功能

中间的部分是使用上面的两个层支持的jar包

下面的是spring核心包

   导入核心包:

     

还需要日志包,市面上有非常好的日志: apache logging log4j 去spring当年整合的文件夹中去找。

 

2. 创建一个对象 User (bean类)

public class Workers {
    private String name;
    private String age;

}

 必须要有一个无参的构造函数

书写两个属性的get和set方法并重写toString()

3. 书写配置文件

   配置文件吗,名字和位置都没有要求

   但是建议放在src路径下 applicationContext.xml

   导入约束

   配置bean类

<bean name="workers" class="cn.hd.text_again.Workers"></bean>

4. 书写测试类

   

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 读取配置文件
Workers workers = (Workers) ac.getBean("workers"); 取出配置文件中的bean类
System.out.println(workers);

测试之后的代码:

 

Spring框架的思想

(1)Ioc(控制反转)由spring框架来帮我们创建对象

(2)di(依赖注入)为了实现ioc思想

   对象属性的注入

    

spring 工厂    


BeanFactory:

  spring最原始的接口  创建实体bean类用的,适用于资源贫瘠

beanFactory:创建对象的方式 什么时候使用什么时候创建

applicationContext

     现在用的

     创建对象的方式是加载完配置文件后就创建

FileSystemXmlApplicationContext 从指定的绝对路径读取配置文件

ClassPathXmlAppcationContext  从类的路径读取配置文件

Spring配置详解

1. 配置bean元素

  

<!--
    配置bean元素
      name  给对象起个名字
      class  类的完整路径名
      id: 唯一 里面不能出现特殊字符 struts2  "/sa"
-->   
<bean name="user" class="cn.hd.text.User" id="user"></bean>

2.创建方式

<!--scope 对象的创建方式
        singleton 单例模式(默认)  
        prototype  多例模式(什么时候用,什么时候创建 并且创建的方式是每次new ;)
        了解: 坚决不用
        request  web 环境下  对象的生命周期和request一样
        session web环境下  对象的生命周期和session一样
-->
<bean name="user" class="cn.hd.text.User" id="user" scope="prototype"></bean>

默认是单例模式

  一般情况下全都用默认的。

多例模式,在整合struts2的时候action必须使用多例模式

3. 生命周期的方法

在对象创建后马上就执行一个方法

对象销毁前执行一个方法

<bean name="user" class="cn.hd.text.User" id="user" init-method="init" destroy-method="destroy"></bean>

 User类中,书写init 和destroy方法

 测试,可以手动的去销毁对象,调用ClassPathXmlApplicationContextclose

  注意:销毁对象,这个对象必须是单例的,如果是多例的无法手动销毁

 

4. 

Spring 创建对象的方式

 (1)无参数的构造函数 (重点使用)

 (2)静态工厂实例化 (了解)

<bean name="workersFactory" class="cn.hd.text.WorkersFactory" factory-method="createWorkers"></bean>

  并且创建一个UserFactory 该类提供了一个静态的creatUser方法

public static User createUser(){
    System.out.println("静态工厂创建");
    return new User();
}

Workers workers1 = (Workers) ac.getBean("workersFactory");

 

 

(3) 实例化工厂创建(了解)

<bean name="workersFactory1" class="cn.hd.text.WorkersFactory" ></bean>
<bean name="user1" factory-bean="workersFactory1" factory-method="createWorkers1"></bean>

 

public User createUser1(){
    System.out.println("实例化工厂创建");
    return new User();
}

 

Workers workers1 = (Workers) ac.getBean("workersFactory");

对象属性的注入

(1) set 注入(最重要的)

基本属性 8大基础类型+String

<bean name="car" class="cn.hd.injection.Car">
    <property name="name" value="布加迪威龙"></property>
    <property name="color" value="黑色"></property>
</bean>

name 类属性名 value 属性值

 

2)引用属性  对象

<bean name="user" class="cn.hd.injection.User">
    <property name="name" value="吕佳伟"></property>
    <property name="age" value="21"></property>
    <property name="address" value="河南"></property>
    <property name="car" ref="car"></property>
</bean>

 name 类的属性名 ref 引用的bean的name

 

(3)构造函数的注入

<bean name="user1" class="cn.hd.injection.User">
    <constructor-arg name="name" value="张三" index="1" type="java.lang.String"></constructor-arg>
    <constructor-arg name="age" value="20"></constructor-arg>
    <constructor-arg name="car" ref="car"></constructor-arg>
</bean>

name   value(ref)      index          type

属性   具体的值        参数的位置     参数的类型    

 

3)p空间注入 (最简单)但是业界不认可<property>

导入约束

xmlns:p="http://www.springframework.org/schema/p"

http://www.springframework.org/schema/p

 

<bean name="user2" class="cn.hd.injection.User"
      p:name="李四" p:age="20" p:car-ref="car"
>
</bean>

 

(4)spel注入类似于el和ognl表达式

<bean name="user3" class="cn.hd.injection.User">
    <property name="name" value="#{user2.name}"></property>
    <property name="car" value="#{car}"></property>
</bean>

 

复杂类型的注入

 

数组:

 

<bean name="collectionBean" class="cn.hd.injection.CollectionBean">
        <property name="arr" value="1"></property>

<!--数组中的元素只有一个那么它的配置和基本类型一样 -->

如果有多个数据
    
<property name="arr">
        <array>
            <value>张三</value>
            <value>李四</value>
            <ref bean="car"></ref>
        </array>
    </property>
</bean>

 

List/set

<!--List集合中只有一个元素配置和基本的一样-->
<property name="list" value="1"></property>

<bean name="collectionBean" class="cn.hd.injection.CollectionBean">
        <property name="list">
        <list>
            <value>王五</value>
            <value>陈六</value>
            <ref bean="user1"></ref>
        </list>
    </property>
</bean>

 

Map

键值对  key  key-ref value value-ref Map<k,v>

<bean name="collectionBean" class="cn.hd.injection.CollectionBean">

<property name="map">
    <map>
        <entry key="name" value="赵钱"></entry>
        <entry key="user" value-ref="user2"></entry>
       <!-- <entry key-ref=""></entry>-->
    
</map>
</property>

</bean>

 

Properties

<property name="properties">
    <props>
        <prop key="driverClass">com.jdbc://mysql</prop>
        <prop key="driverUrl">jdbc://localhost:3306/...</prop>
        <prop key="user">root</prop>
    </props>
</property>

 

 

模块化

  Src目录下

<import resource="classpath:applicationContext.xml"></import>

Resource 其他配置文件的地址

 

使用注解配置spring

1. 导包 4+2+1

aop

 

2. 导入约束文件

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context.xsd

3. 指定扫描的包

<!--指定扫描的位置,自动扫描该包以及该包所有的子包-->
     <context:component-scan base-package="cn.hd.annotation"></context:component-scan>

4. 为类声明注解

在类上书写代码

@Component("user")

//@Controller("user")//web层
//
@Service("user") //service 层
//
@Repository("user")//dao层

//为了解决所有的bean都是同一个注解,导致层次不清淅,提出了三个新的注解

public class User { 相当于在.xml bean name=user class=cn.hd.annotationUser
    private String name;
    private Integer age;
    private String address;
    private Car car;

}

没有强制要求,都可以用,提倡按照他的本意去注解

 

修改Scope属性

@Scope(scopeName = "prototype") singleton|prototype 单例(默认)和多例

 

属性注入:

(1) 值类型: 注解写在属性上面,同时也可以写在set方法上面

@Value("张三")
private String name;
@Value("20")
private Integer age;
@Value("河南")
private String address;

(2) 引用类型:

// @Autowired //自动装配 如果只有一个对象  自动装配
//    @Qualifier("car2") //自动装配时有多个对象要指定那个对象,与自动装配结合使用
//    @Resource(name = "car")  //直接指定配置那个对象

private Car car;

(3) 创建对象后就执行的方法

@PostConstruct
public void init(){
    System.out.println("创建对象后自动执行");
}
@PreDestroy
public void destroy(){
    System.out.println("对象销毁前执行");
}

  

 

 

 

 

Spring结合junit

1. 导包

test

2. 书写测试代码

@RunWith(SpringJUnit4ClassRunner.class)//结合junit测试
@ContextConfiguration("classpath:cn/hd/annotation/applicationContext.xml") //读取配置文件

  由于原来使用的是application对象,读取配置和获得bean对象

  但是现在没有了 又想获得对象

@Resource(name="user")
private User user;



猜你喜欢

转载自blog.csdn.net/zyz0225/article/details/80912898