以下内容集成到了GitHub项目中,有兴趣的朋友可以看一下GitHub

https://github.com/HeShuai-GitHub/springDemo.git

一、spring依赖引入

  1. maven依赖引入
 <!--spring依赖 start-->

<!--这个jar文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
    <!--    这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion ofControl / Dependency Injection(IoC/DI)
        操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
    <!--    这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,
        JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <!--支持缓存Cache(ehcache)、JCA、JMX、 邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类。-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <!--模块提供了一个强大的表达式语言,用于在运行时查询和处理对象图。该语言支持设置和获取属性值;属性赋值,
        方法调用,访问数组的内容,收集和索引器,逻辑和算术运算,命名变量,并从Spring的IOC容器的名字对象检索,
        它也支持列表选择和投影以及常见的列表聚合。-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <!--spring jdbc依赖,这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <!--依赖数据库的jar包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.26</version>
        </dependency>


        <!--spring依赖 end-->

关于spring各个jar包的具体含义可以参考烟火里的尘埃

二、配置文件

spring默认配置文件名为

applicationContext.xml

在配置文件applicationContext.xml引入spring的命名空间,命名空间规定了xml文件中可以使用的标签
1 简单配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--spring的命名空间,他的作用是,xml文件本身是可扩展标记语言,简单点说就是在xml文件中没有固定的语法标签,任何标签都可以使用
这也代表了填写标签时没有任何提示信息,而spring命名空间的作用就是规范spring的xml配置文件的标签-->
<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>
        <bean id="person" class="com.spring.ioc.modal.Person">
            <!--初始化成员变量的值 value:初始化基本数据类型;ref:初始化引用变量-->
            <property name="id" value="110"></property>
            <property name="dog" ref="dog"></property>
        </bean>

        <bean id="dog" class="com.spring.ioc.modal.Dog">
            <property name="name" value="小白"></property>
            <property name="color" value="白色"></property>
        </bean>
    </beans>

</beans>
  1. P和C命名空间
    在通过构造方法或set方法给bean注入关联项时通常是通过constructor-arg元素和property元素来定义的,引入p和c命名空间后,的把它们当做bean的一个属性来进行定义bean属性。此部分借鉴于elim168的博客

例子如下,和上述xml配置文件进行对比

<?xml version="1.0" encoding="UTF-8"?>

<!--P和C命名空间:传统在通过构造方法或set方法给bean注入关联项时通常是通过constructor-arg元素和property元素来定义的。
有了p命名空间和c命名空间时我们可以简单的把它们当做bean的一个属性来进行定义,具体属性定义如下-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <beans>
        <!--set方法 p空间模式注入-->
        <bean id="person" class="com.spring.ioc.modal.Person" p:id="110" p:dog-ref="dog"></bean>
        <!--构造方法 c空间模式注入-->
        <bean id="dog" class="com.spring.ioc.modal.Dog" c:_0="小黄" c:_1="黄色"></bean>
    </beans>

</beans>
  1. spring jdbc 连接数据库,可以参考大胡子叔叔_的博客
    需要添加jar包
<!--spring jdbc依赖,这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <!--依赖数据库的jar包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.26</version>
        </dependency>

配置一个db.properties的资源文件

# 数据库配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/beifen
jdbc.username=root
jdbc.password=123

spring的配置文件可以写成

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
       >

    <!--使用Bean定义 来读取properties文件-->
<!--    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:/jdbc/db.properties"></property>
    </bean>-->

    <!--context命名空间  读取资源文件 读取properties文件
        必须先配置context命名空间,xmlns:context="http://www.springframework.org/schema/context"
		 xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
    -->
    <context:property-placeholder location="jdbc/db.properties"></context:property-placeholder>

    <!--获取连接数据看的数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/beifen"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123"></property>
    </bean>

    <!--将数据源注入到jdbcTemplate中-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

三、IOC和DI

  1. IOC
    IOS即控制反转,是一种编程思想,指将java中的创建对象的行为交给spring容器来进行操作,我们不需要关心创建对象的细节,这部分工作对于我们来说是透明的。
  2. DI
    DI即依赖注入,也就是IOC的另外一种表示方式,简单点说,IOC就是一种反转控制思想,而Di是IOC控制反转的具体实现方式

随手记:

反射创建对象的前提是,该对象一定具有无参构造方法
Ctrl+T 查看该类的所有子类以及实现类
Ctrl+Alt+U 查看该类上级所有类的继承关系
字面量:即java中的基本数据类型以及他的包装类,再加上String类型
自动装配:也叫自动注入,即赋值,一般自动转配指的是非字面量的属性

四、IOC注解方式装配Bean

  1. 相关注解介绍
    1.1 @Component、@Controller、@Service、@Repository
    以上这四个注解都可以用来标记类,使spring ioc容器将相关类的bean自动装配到ioc容器中,功能一致,不过@Controller用来标识“控制层”;@Service用来标识“业务层”;@Repository用来标识“持久层”;@Component没有特定含义,普遍意义上的标识。

    1.2 @AutoWire、@Resource、@Qualifier
    @AutoWire:用来自动装配ioc容器中的bean到所标识的属性中,即赋值的过程,以byType的方式在ioc容器中进行搜索,当byType搜索不到时,使用byName的方式查找
    @Resource:与上述的功能基本相同,不过优先以byName的方式进行查找,查找不到时使用byType的方式查找
    @Qualifier:当使用@AutoWire时,ioc容器中有两个可以匹配类型的bean时,使用@Qualifier进行指定IOC中的id

  2. 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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <!--需要配置 context命名空间
        component-scan,组件扫描,即扫描指定包下边的所有组件;
        组件:即所有被spring加载的bean
        作为spring的组件进行加载,会自动在springIOC容器中生成相应的bean,这些bean的id以类的小写首字母为准;
        use-default-filters:默认过滤规则,即扫描指定包下的所有类
        include-filter: 只包含某个条件。
            type:annotation,指定注解,assignable,指定类;
            expression:指定类或注解
            注:use-default-filters必须为false,不扫描包
        exclude-filter:排除某个条件
ype:        annotation,指定注解,assignable,指定类;
            expression:指定类或注解
            注:use-default-filters必须为true,扫描包,只有扫描后才可以排除
        注:因为use-default-filters的属性值冲突,所以include-filter和exclude-filter可以定义多个,但是不可以同时定义
    -->
    <context:component-scan base-package="com.spring.ioc.main_2.annotation" use-default-filters="true">
        <!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="assignable" expression="com.spring.ioc.main_2.annotation.controller.AnnotationController"/>-->
        <!--<context:exclude-filter type="assignable" expression="com.spring.ioc.main_2.annotation.controller.AnnotationController"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
    </context:component-scan>


</beans>

五 结语

自此,spring IOC初级学习部分就差不多到这里了,博客中的一些概念可能写的并不清楚,有些时候也是在学习的过程中随笔记下来的,更全的内容我会随着我写的springDemo样例上传到了GitHub,有兴趣的朋友可以看看,路过的大神请不吝赐教。
在此再次感谢本文引入的博客对我学习过程中的帮助,技术只要分享就可以越来越好

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐