Spring学习笔记一

本文详细介绍了Spring框架的基本概念、优点、体系结构,以及如何创建第一个Spring程序。通过Maven和IDEA配置Spring项目,展示了Bean的配置、依赖注入的两种方式(属性注入和构造方法注入)。此外,还讲解了静态工厂和实例工厂实例化Bean的方法。最后,文章分享了在学习Spring框架过程中的收获。
摘要由CSDN通过智能技术生成

1.什么是Spring

Spring是一款目前主流的 Java EE 轻量级开源框架,它是以IOC(控制反转)和AOP(面向切面编程)为内核。

2.Spring框架的优点

1.方便解耦,简化开发

2.支持AOP

3.方便程序的测试

4.方便集成各种优秀框架

3.Spring的体系结构

4.入门的第一个程序(基于Maven,IDEA版)

1.创建Module->Maven->选择“Create from archetype”->找到如图选项并创建好项目

2.在pom.xml的poject标签中配置以下代码导入包(配置完成不要忘记点击刷新)

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.16</version>
    </dependency>
</dependencies>

 3.创建com.dao包并创建UserDao.java(最好自己手敲一遍)

public interface UserDao {
    public void save();
}

4.在dao包中创建impl包并在impl包中创建UserDaoImpl.java

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

5.在resources文件夹中创建applicationContext.xml,在beans标签中添加

<bean id="userDao" class="com.dao.impl.UserDaoImpl"/>

6.在impl包下创建Test.java

public class Test implements UserService {
    public static void main(String[] args) {
        //1.初始化spring容器,加载配置文件
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.通过容器获取userDao实例
        UserDao userDao = (UserDao) app.getBean("userDao");
        //3.调用实例中的save()方法
        userDao.save();
    }
}

写完之后在Test.java中点击运行并看到save running...即为成功

5.Spring框架中配置文件的常用配置

在Spring中,XML配置文件(之前的applicationContext.xml)的<beans>中包含多个<bean>子元素,每一个<bean>子元素定义了一个Bean。在<bean>中同样包含了多个属性以及子元素:

1.id:是一个Bean的唯一标识符

2.class:该属性指定了Bean的具体实现类

3.scope:设定Bean实例的作用域。其中比较重要的两个属性值:

        singleton(单例):无论如何实现类只有一个实例,对象在加载配置文件时创建,当应用卸载,销毁容器时,对象就被销毁了。

        prototype(原型):Spring容器会为每个对该Bean的请求都创建一个新的实例,在每次getBean时创建对象,对象长时间不用时就会被Java垃圾回收器回收。

4.property:<bean>的子元素,用于调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。该元素的name属性用于指定Bean实例中相应的属性名,ref属性传入Bean的参数为对象时使用,value属性则为传入Bean的参数为普通值使用。在property元素还有3个子元素:

        list:用于封装List或数组类型的依赖注入,用法如下

        <property name="实例的列表名">
            <list>
        <!--集合内数据为普通数据类型-->
                <value>123</value>
                <value>13</value>
                <value>12</value>
        <!--集合内数据为对象数据类型-->
                <!--<ref></ref>-->
            </list>
        </property>

        map:用于封装Map类型属性的依赖注入

<property name="实例的Map名">
    <map>
        <entry key="user1" value-ref="user1"/>
        <entry key="user2" value-ref="user1"/>
    </map>
</property>

        其中entry代表每一个键值对,entry元素中有key、value、key-ref、value-ref四种属性,不加-ref的为普通值,而加了-ref的为引用类型

       props:用于封装Properties类型属性的依赖注入

<property name="properties">
    <props>
        <prop key="123">popo</prop>
        <prop key="12">ppopo</prop>
    </props>
</property>

6.依赖注入

依赖注入(DI)是控制反转(Ioc)的一种方式。

以往我们在一个类中需要调用另外一个类的方法,我们会通过new被调用类来创建对象,进而调用方法,这样做会使调用类与被调用类的耦合性增加。

在Spring框架中,不需要我们再去创建对象,而是由Spring容器来创建。这就是控制反转。

换句话来说,平常我们需要哪个类就调用调用哪个类,现在在Sping中,由Spring帮我们创建对象,我们只需要写配置文件,在方法类中加载配置文件,获取对应实例再调用实例中的方法即可。

依赖注入的实现方式有两种:

1.属性注入

2.构造方法注入

3.接口注入(还未学)

第一种方式实现如下:

一、在com包下创建service包并创建UserServicce类

public interface UserService {
    public void save();
}

二、在service包内创建impl包并在impl包下创建UserServicce类的实现类UserServiceImpl

public class UserServiceImpl implements UserService {

    //声明UserDao属性
    private UserDao userDao;
    //添加UserDao属性的setteer方法,用于实现依赖注入
    public void setUserDao(UserDao userDao) {
        this.userDao =  userDao;
    }
    //实现接口中方法
    public void save() {
        //调用userDao中的save()方法
        this.userDao.save();
    }
}

三、在applicationContext.xml中的<beans>元素内配置

<bean id="userService" class="com.service.impl.UserServiceImpl">

<!--将id为userDao的Bean实例注入到userService实例中-->     

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

</bean>

四、创建测试类Test

public class Test {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.save();

    }
}

运行测试类,你会发现在调用UserServiceImpl的方法的同时也调用了UserDaoImpl的方法,而代码上的改变只是在接口实现类声明UserDao属性并添加了属性的setter方法,并在配置文件的<bean>元素内加上<property>元素而已。

第二种方式实现(在第一种方式的基础上)如下:

一、在原有的applicationContext.xml文件中将第一种方式的配置注释,添加

<!--构造方法注入-->
    <bean id="userService" class="com.service.impl.UserServiceImpl" >
    <!--引用数据类型调用用 ref-->
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>

二、在UserServiceImpl中把setUserDao方法注释,换为

public UserServiceImpl(UserDao userDao) {
    this.userDao = userDao;
}

额外补充

        1.在applicationContext.xml中可以将Bean的依赖注入写为以下形式:

<!--原来写法-->
<bean id="userService" class="com.service.impl.UserServiceImpl">
<!--将id为userDao的Bean实例注入到userService实例中-->
    <property name="userDao" ref="userDao"/>
</bean>

<!--p命名空间-->
<bean id="userService" class="com.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>

 但是,要用p命名空间,需要在applicationContext.xml的beans元素中写入

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

如图:

       2.在Test类中的通过容器创建实例中有两种创建方法如下:

        //两种方式创建UserService
        //第一种(根据id找到bean)
        UserService userService = (UserService) app.getBean("userService");
        //第二种(仅在applicationContext.xml中相同Class只有一个bean的情况,否则报错)
        UserService userService = app.getBean(UserService.class);

7.Bean的实例化

实例化Bean有三种方式:构造器实例化、静态工厂实例化和实例工厂方式实例化

前边依赖注入 便是构造器实例化。

第二种静态工厂实例化的实现:

1.编写工厂类并在其中创建静态的放回值为Bean的方法

2.在配置文件中编写

<bean id="bean" class="你写的工厂类的相对路径" factory-method="工厂类的那个静态方法"/>

3.在测试类中

//1.初始化spring容器,加载配置文件
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//        System.out.println(app.getBean("bean"));

第三种实例工厂方式实例化的实现:

1.编写工厂类并在其中创建放回值为Bean的方法

2.在配置文件中编写

<bean id="factory" class="你写的工厂类的相对路径"/>

<bean id="bean" factory-bean="factory" factory-method="工厂类中那个方法"/>

3.在测试类中

//1.初始化spring容器,加载配置文件
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//        System.out.println(app.getBean("bean"));

 这是我在

黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全套教程(spring+springmvc+mybatis)_哔哩哔哩_bilibili

学习的第一天的成果。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值