Spring快速入门学习(1)

目录

1.Spring是什么(理解)

 Spring的组织架构:

Spring总结起来优点如下:

Spring思想提出如下:

BeanFactory与ApplicationContext的关系:

常用的三个ApplicationContext:

2.SpringBean的配置详解

Bean的常用配置:

Bean的范围配置:

Bean的延迟加载:

3.代码

3.1入门

3.2Bean依赖注入方式


1.Spring是什么(理解)

官网地址: Spring | Home

 Spring的组织架构:

51c585c3cd42426eb46c127ad5acabe2.png

 

Spring总结起来优点如下:

 

1.低侵入式设计,代码的污染极低。

2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。

3.Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。

4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。

5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。

6.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。

 

Spring思想提出如下:

 

 

257911f4eccd4ccf905a0c5878766454.png

 

BeanFactory与ApplicationContext的关系

 

1)BeanFactory是Spring的早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级接口,称之为Spring 容器;

2)ApplicationContext在BeanFactory基础上对功能进行了扩展,例如: 监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;

3)Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。

4)Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建(延长加载),而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化并初始化好。

 

常用的三个ApplicationContext

只在Spring基础环境下,常用的三个ApplicationContext作用如下:

8358f131b16547b987d093ce0cf6cf23.png

2.SpringBean的配置详解

 

Bean的常用配置:

 

46fe9a138ecf478f836ea72d7f4a93b7.png

 

Bean的范围配置:

 

取值范围

singleton

默认值,单例的

prototype

多例的

request

WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中

session

WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中

global session

WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session

 

Bean的延迟加载:

当lazy-init设置为true时为延迟加载,也就是当Spring容器创建的时候,不会立即创建Bean实例,等待用到时在创建Bean实例并存储到单例池中去,后续在使用该Bean直接从单例池获取即可,本质上该Bean还是单例的。

<bean id="userDao" class="com.gz.dao.UserDaoImpl" lazy-init="true"/>

3.代码

 

3.1入门

  1. 建立maven项目,导入相关依赖
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.8</version>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>RELEASE</version>
    </dependency>
</dependencies>
  1. 建包,在包下写下 UserDao和UserDaoImpl相关类

 

UserDao:

public interface UserDao {
    public void save();
}

 

UserDaoImpl:

 

public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("UserDao save method running....");
    }
}

 

Test:

 

public class UserDaoTest {
    @Test
    //法1:普通法
    public void test1() {
        UserDao userDao = new UserDaoImpl();
        userDao.save();
    }

    @Test
    public void test2() {
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        //法2:
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.save();
        //法3:
        UserDao userDao2 = applicationContext.getBean("userDao", UserDao.class);
        userDao2.save();

    }

}

 

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">
    <bean id="userDao" class="com.gz.core.dao.UserDaoImpl" ></bean>

</beans>

以上就是基础入门。

3.2Bean依赖注入方式

  依赖注入方式有:set方法和构造方法,具体怎么用,如下代码所示。

在上面UserDao  UserDaoImpl基础上,再建立如下

UserService:

 

public interface UserService {
    void save();
}

 

UserServiceImpl:有2种写法

Set

public class UserServiceImpl implements UserService {

    private UserDao userDao;

@Override
    public void save() {
        userDao.save();
    System.out.println("-------- save();--------");
    }
    //构造set
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
        System.out.println("------setUserDao--------");
    }
}

 

 

构造器

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    //构造方法

    //没有调用无参
    public UserServiceImpl() {
        System.out.println("-------UserServiceImpl----");
    }

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
        System.out.println("-------UserServiceImpl(UserDao userDao)------------");
    }
@Override
    public void save() {
        userDao.save();
    System.out.println("-------- save();--------");
    }

}

分别对应的配置文件applicationContext.xml:

Set:

<?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">
    <bean id="userDao" class="com.gz.core.dao.UserDaoImpl" ></bean>

<bean id="userService" class="com.gz.core.service.UserServiceImpl">
         <!-- id配置的是beanname,没有配id,可用name的别名首个单词,没有name,可用class-->

          <property name="userDao" ref="userDao"/>

         <!-- ref为引用,引用dao中的id(id可以任意起)

          .一定注意这里的name是set方法的名称而不是属性名,
          spring是根据这个name做了首字母大写和拼接set字符串而找到的set方法
          ,并通过反射调用该方法对属性赋值, 再说一遍这不是属性名-->
      </bean>

</beans>

 

构造器:


 

<?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">
    <bean id="userDao" class="com.gz.core.dao.UserDaoImpl" ></bean>

  <bean id="userService" class="com.gz.core.service.UserServiceImpl">
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>

</beans>



猜你喜欢

转载自blog.csdn.net/weixin_52733693/article/details/130318137