Spring-01

Spring

1.Spring是什么?

spring是一个开源的Java应用框架,它提供了一套全面的基础设施支持

2.Spring框架的主要特点

1)依赖注入(Dependency Injection,DI)

2)面向切面编程(AOP)

3)事务管理

4)Web支持

5)数据访问

6)测试支持

7)扩展性

3.为什么使用Spring?

1)方便解耦,简化开发

2)Spring就是一个大工厂,可以将所有对象创建和依赖关系维护的工作交给Spring来完成

3)Spring提供面向切面编程,可以方便地实现对程序进行权限拦截、运行监控等功能

4)声明式事务的支持只需要通过配置就可以完成对事务的管理

5)方便集成各种优秀的框架

6)降低JavaEE中API的使用难度

4.Spring的IOC

IOC是控制反转,即获取依赖对象的过程被反转了。

控制反转之后,获取依赖对象的过程由自身管理变成了由IOC容器自动注入。

简单来讲,控制反转之后,获取依赖对象的过程从原来的自己new一个对象变成了从IOC容器中拿出来直接用即可。

5.Spring的环境搭建

5.1创建项目

5.2引入核心依赖

首先,在最外层的pom.xml文件中引入Spring的核心基础依赖

<!--Spring核心基础依赖-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring.version}</version>
</dependency>
<!--日志相关-->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<!--测试相关-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

然后,在properties标签下引入spring的版本

<spring.version>4.2.5.RELEASE</spring.version>

还需要设置打包方式,其中pom为不参与打包,jar为打为jar包,war为打为war包

<packaging>pom</packaging>

5.3添加配置文件

在每个子模块下的resources文件夹下创建一个applicationContext.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">
        
</beans>

5.4将bean的实例化工作交给Spring来完成

5.4.1通过set方法注入

service层中UserServiceImpl类中的代码

public class UserServiceImpl implements IUserService {

    @Setter
    private IUserMapper userMapper;

    @Override
    public User getUserById(int id) {

        User userById = userMapper.getUserById(id);
        return userById;
    }
}

在IOC容器中进行设置

<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name为属性名字   /   ref为引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl">
	<property name="userMapper" ref="userMapper"/>
</bean>

测试

public class UserTest {
    @Test
    public void getUserById() {
        int id = 1001;

        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        // userService是bean的id或name
        UserServiceImpl userService = (UserServiceImpl) applicationContext
                .getBean("userServiceImpl");

        User userById = userService.getUserById(id);
        System.out.println(userById);
    }
}
5.4.2通过构造方法注入

service层中UserServiceImpl类中的代码

public class UserServiceImpl implements IUserService {

    private IUserMapper userMapper;

    public UserServiceImpl() {
    }

    public UserServiceImpl(IUserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public User getUserById(int id) {

        User userById = userMapper.getUserById(id);
        return userById;
    }
}

在IOC容器中进行设置

<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name 属性名字   /   ref 引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl">
	<constructor-arg ref="userMapper"/>
</bean>

6.scope

6.1singleton

如果scope取值为singleton,表明容器中创建时只存在一个实例,也就是单例模式

如果不进行设置scope,默认就是singleton

6.2prototype

每次获取都创建一个新的对象,并且这个对象的生命周期不归Spring管理

7.自动装配(自动注入)

通过Autowire,有两种取值:①byName ②byType

7.1byName

byName是通过set方法的名字进行匹配的,如果找不到,就是不赋值

例如setUserMapper方法,通过byName,就会找到userMapper,如果bean的name或id也为userMapper,就可以找到(区分大小写)

<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name 属性名字   /   ref 引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl" autowire="byName">
</bean>
public class UserServiceImpl implements IUserService {

    private IUserMapper userMapper;

    //set方法  找的时候 把set去掉 U改为小写 找的是userMapper
    public void setUserMapper(IUserMapper userMapper) {
        this.userMapper = userMapper;
    }
    
    public UserServiceImpl() {
    }

    public UserServiceImpl(IUserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public User getUserById(int id) {

        User userById = userMapper.getUserById(id);
        return userById;
    }
}

7.2byType

byType是通过set方法的参数列表中的数据类型进行匹配的,如果beans.xml中出现了多个相同类型的对象,就会报错

如setUserMapper(IUserMapper userMapper)方法,通过byType,就会找到IusMapper,如果是接口,就去找对应的实现类

<bean name="userMapper" class="com.tledu.lsz.mapper.UserMapperImpl"/>
<!--name 属性名字   /   ref 引用的bean的名字-->
<bean name="userService" class="com.tledu.lsz.service.UserServiceImpl" autowire="byType">
</bean>
public class UserServiceImpl implements IUserService {

    private IUserMapper userMapper;

    public void setUserMapper(IUserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public UserServiceImpl() {
    }

    public UserServiceImpl(IUserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public User getUserById(int id) {

        User userById = userMapper.getUserById(id);
        return userById;
    }
}

8.生命周期

在bean标签中设置属性init-method=“方法名”,在初始化时会执行该方法

在bean标签中设置属性destroy-method=“方法名”,在销毁时会执行该方法

9.迟加载

在bean标签中设置属性lazy-init=“true"或"false”

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值