Spring模块--Core核心模块详解-IOC创建对象

一.六大模块

  • Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系
  • Spring Web Spring对web模块的支持。

    • 可以与struts整合,让struts的action创建交给spring
    • spring mvc模式
  • Spring DAO Spring 对jdbc操作的支持 【JdbcTemplate模板工具类】
  • Spring ORM spring对orm的支持:

    • 既可以与hibernate整合,【session】
    • 也可以使用spring的对hibernate操作的封装
  • Spring AOP 切面编程
  • SpringEE spring 对javaEE其他模块的支持

 二.搭建配置环境

jar:

  • commons-logging-1.1.3.jar 日志
  • spring-beans-3.2.5.RELEASE.jar bean节点
  • spring-context-3.2.5.RELEASE.jar spring上下文节点
  • spring-core-3.2.5.RELEASE.jar spring核心功能
  • spring-expression-3.2.5.RELEASE.jar spring表达式相关表

bean.xml:


<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: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.xsd">
    
</beans>   

三.得到容器对象

spring的容器,可以归类为两种类型

  • Bean工厂,BeanFactory【功能简单】 
  • 应用上下文,ApplicationContext【功能强大,一般我们使用这个】

通过Resource获取BeanFactory

  • 加载Spring配置文件
  • 通过XmlBeanFactory+配置文件来创建IOC容器


        //加载Spring的资源文件
        Resource resource = new ClassPathResource("applicationContext.xml");

        //创建IOC容器对象【IOC容器=工厂类+applicationContext.xml】
        BeanFactory beanFactory = new XmlBeanFactory(resource);
        

通过类路径获取ApplicationContext


        // 得到IOC容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        System.out.println(ac);

        

 

在Spring中总体来看可以通过三种方式来配置对象:

  • 使用XML文件配置
  • 使用注解来配置
  • 使用JavaConfig来配置

3.1xml配置方式

在上面我们已经可以得到IOC容器对象了。接下来就是在applicationContext.xml文件中配置信息【让IOC容器根据applicationContext.xml文件来创建对象】

  • 首先我们先有个JavaBean的类


public class User {

    private String id;
    private String username;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
  • 创建bean

       <!--
        使用bean节点来创建对象
            id属性标识着对象
            name属性代表着要创建对象的类全名
        -->
    <bean id="user" class="User"/>
  • 在外界通过IOC容器对象得到User对象


        // 得到IOC容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        User user = (User) ac.getBean("user");

        System.out.println(user);

 

上面我们使用的是IOC通过无参构造函数来创建对象,我们来回顾一下一般有几种创建对象的方式:

  • 无参构造函数创建对象
  • 带参数的构造函数创建对象
  • 工厂创建对象

    • 静态方法创建对象
    • 非静态方法创建对象

3.2带参构造函数创建对象

首先bean应该带有有参构造方法


    <bean id="user" class="User">

        <!--通过constructor这个节点来指定构造函数的参数类型、名称、第几个-->
        <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg>
        <constructor-arg index="1" name="username" type="java.lang.String" value="zhongfucheng"></constructor-arg>
    </bean>

3.3静态工厂方法 

首先,使用一个工厂的静态方法返回一个对象


public class Factory {

    public static User getBean() {

        return new User();
    }
      
}

    <!--工厂静态方法创建对象,直接使用class指向静态类,指定静态方法就行了-->
    <bean id="user" class="Factory" factory-method="getBean" >

    </bean>

 

3.4非静态工厂方法


public class Factory {

    
    public User getBean() {

        return new User();
    }


}

    <!--首先创建工厂对象-->
    <bean id="factory" class="Factory"/>

    <!--指定工厂对象和工厂方法-->
    <bean id="user" class="User" factory-bean="factory" factory-method="getBean"/>

 

3.5注解方式

通过注解来配置信息就是为了简化IOC容器的配置,注解可以把对象添加到IOC容器中、处理对象依赖关系,我们来看看怎么用吧:

使用注解步骤:

  • 1)先引入context名称空间

    • xmlns:context="http://www.springframework.org/schema/context"
  • 2)开启注解扫描器

    • <context:component-scan base-package=""></context:component-scan>
    • 第二种方法:也可以通过自定义扫描类以@CompoentScan修饰来扫描IOC容器的bean对象。

创建对象以及处理对象依赖关系,相关的注解:

  • @ComponentScan扫描器
  • @Configuration表明该类是配置类
  • @Component 指定把一个对象加入IOC容器--->@Name也可以实现相同的效果【一般少用】
  • @Repository 作用同@Component; 在持久层使用
  • @Service 作用同@Component; 在业务逻辑层使用
  • @Controller 作用同@Component; 在控制层使用
  • @Resource 依赖关系

    • 如果@Resource不指定值,那么就根据类型来找,相同的类型在IOC容器中不能有两个
    • 如果@Resource指定了值,那么就根据名字来找
package aa;

import org.springframework.stereotype.Repository;


//把对象添加到容器中,首字母会小写
@Repository
public class UserDao {

    public void save() {
        System.out.println("DB:保存用户");
    }


}

package aa;


import org.springframework.stereotype.Service;

import javax.annotation.Resource;


//把UserService对象添加到IOC容器中,首字母会小写
@Service
public class UserService {

    //如果@Resource不指定值,那么就根据类型来找--->UserDao....当然了,IOC容器不能有两个UserDao类型的对象
    //@Resource

    //如果指定了值,那么Spring就在IOC容器找有没有id为userDao的对象。
    @Resource(name = "userDao")
    private UserDao userDao;

    public void save() {
        userDao.save();
    }
}

 


package aa;

import org.springframework.stereotype.Controller;

import javax.annotation.Resource;



//把对象添加到IOC容器中,首字母会小写
@Controller
public class UserAction {

    @Resource(name = "userService")
    private UserService userService;

    public String execute() {
        userService.save();
        return null;
    }
}

3.6通过Java方式 

由于Spring的自动装配并不能将第三方库组件装配到应用中,于是需要显式装配配置。显示装配有两种方式

  • 通过java代码装配bean
  • 通过XML装配bean

Spring In Action作者首推使用自动装配的功能,而后是通过java代码配置bean,最后才用XML文件配置的方式..

那么怎么通过java代码来配置Bean呢??

  • 编写一个java类,使用@Configuration修饰该类
  • 被@Configuration修饰的类就是配置类

使用配置类创建bean:

  • 使用@Bean来修饰方法,该方法返回一个对象。
  • 不管方法体内的对象是怎么创建的,Spring可以获取得到对象就行了。
  • Spring内部会将该对象加入到Spring容器中 
  • 容器中bean的ID默认为方法名


@org.springframework.context.annotation.Configuration
public class Configuration {

    @Bean
    public UserDao userDao() {

        UserDao userDao = new UserDao();
        System.out.println("我是在configuration中的"+userDao);
        return userDao;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值