Spring框架入门浅析

一、Spring Bean的配置
在需要被Spring框架创建对象的实体类的类声明前面加注解:@component。这样在Spring扫描的时候,看到该注解就会在容器中创建该实体类的对象。那么,Spring如何可以扫描到该类呢?在配置文件夹下,右键-new-Spring Bean Configuration File,然后创建该文件,文件名可以任意,这里设为"applicationContext.xml"。
在applicationContext.xml中,需要配置Spring框架在加载的时候自动扫描的包,通过如下代码片段来设置:

<!-- 配置自动扫描的包
        base-package属性:
    -->
<context:component-scan base-package="com.spring.helloworld"></context:component-scan>

同时,在我们的测试类中声明创建IOC容器对象的时候指明所加载的配置文件。

  1. 创建IOC容器对象
    创建IOC容器对象的同时就创建了实体类的对象。
    如:
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");

这个时候实体类对象已经创建。(可以在实体类中的无参构造函数中打印一段文字,在测试类中执行上面这段代码,会发现控制台会输出打印无参构造器中的文字,说明在创建IOC容器对象的同时就创建了实体类的对象。并且,默认的创建的实体类的对象是单例的。

  1. 获取IOC容器中的实体类对象

然后利用创建好的IOC容器对象来取出创建好了的实体类对象。方法为getBean(),方法重载了有多个,
获取bean的方式
(1)根据bean的名称(id属性值)获取
-默认在IOC容器中对象的id是类名的首字母小写
(2)根据bean的类型获取
-注意:要保证该类型的bean在IOC容器中是唯一的,否则会抛出异常
(3)根据bean的名称和类型获取

Object getBean(String name)
<T> T getBean(String name, Class<T> requiredType)
<T> T getBean(Class<T> requiredType)
Object getBean(String name, Object... args)

① getBean(String name)
注意方法getBean(String name)中,传的字符串参数为实体类的类名首字母小写,比如类名是XxxYyyZzz,要想拿到该类的对象,调用IOC容器对象的方法时,将该类的首字母小写:

ioc.getBean(xxxYyyZzz);

注意该方法的返回值类型为Object,因此如果要用本实体类的变量接收该对象的值时应先进行“造型”(强制类型转换)。如:

HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");

② T getBean(Class requiredType)

这个方法使用时,传参时直接传入 类名.class 即可,并且返回值类型也是实体类的类型,无需造型,但是该方法有个弊端,就是如果Spring框架配置的时候,不是使用注解@Component配置的,而是在配置文件中applicationContext.xml(前文有讲)通过标签来配置的,配置代码片段如下:

<bean id="helloWorld" class="com.spring.helloworld.HelloWorld" scope="prototype"</bean>

<bean id="helloWorld2" class="com.spring.helloworld.HelloWorld"></bean> 

从配置文件中可以看出,配置时配置了两个HelloWorld实体类的对象,分别为helloWorldhelloWorld2
如此一来,在测试类中通过IOC对象获得HelloWorld对象的时候就会出现异常,因为有两个对象,这时候容器不知道取哪个。
另外,由于默认的配置是创建的实体类对象是单例的,要想变成多例,需要在注解前面加@scope("prototype"),这样每次通过ioc取到的对象都是新创建的,而不是同一个了。

  1. 调用实体类中的方法
    直接通过获取到的 实体类的对象.方法() 的方式即可调用。

二、基于注解配置Bean
1)普通组件:@Component
标识一个受Spring IOC容器管理的组件
2)持久化层组件:@Repository
标识一个受Spring IOC容器管理的持久化层组件
3)业务逻辑层组件:@Service
标识一个受Spring IOC容器管理的业务逻辑层组件
4)表述层控制器组件:@Controller
标识一个受Spring IOC容器管理的表述层控制器组件
5)组件命名规则
①默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id
②使用组件注解的value属性指定bean的id

注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以 @Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。

默认情况下,在IOC容器中创建的对象的id是类名的首字母小写,我们可以通过注解的value属性来指定该id,而且value属性名可以省略不写。如:

public interface UserDao {

    void saveUser();
}

@Repository("userDao1") 该实体类的id已经变为UserDao1
//@Repository(value="userDao") 经过该注解的设置后,该实体类的id为UserDao
public class UserDaoImpl implements UserDao {

    @Override
    public void saveUser() {
        System.out.println("UserDaoImpl正在向数据库中插入用户");
    }

}

如果在一个类中想要让Spring创建另一个类的对象,如何注入呢?Spring默认是不会注入的,我们可以再声明另一个类的前面加上注解@Aurowired。如:

@Service("userService")
public class UserServiceImpl implements UserService {

    @Qualifier("userDaoImpl2")
//  @Qualifier(value="userDaoImpl2")
    @Autowired
    private UserDao userDao;

    /*
     * 默认情况下添加了@Autowired注解的属性必须注入成功,否则会抛出异常,我们通过设置该注解
     * 的required的属性值为false来告诉Spring该注解不是必须的,可以不注入
     */
    @Autowired(required=false)
    private User user;

    @Override
    public void saveUser() {
        //调用UserDao中保存用户信息的方法
        userDao.saveUser();
    }

}

默认情况下,如果添加了@Autowired注解的属性,那么必须注入成功,否则会抛出异常,我们通过设置该注解的required的属性值为false来告诉Spring该注解不是必须的,可以不注入。如:

@Autowire(required=false)

总结:

Spring依赖注入(自动装配)的步骤:

  1. 根据bean的类型实现自动装配
  2. 以属性名作为id从IOC容器中寻找以实现自动装配
  3. 如果通过1和2都无法实现自动装配,可以通过@Qualifier注解的value属性指定id实现自动装配,而且value属性名可以省略不写

另外,在Spring中不要在测试类中注入属性!!!可以考虑下为什么~~~

因为,

假如可以注入属性,OK,如果注入属性成功的话,那么,Spring在扫描Test类时,我们添加注解的目的就是为了让Spring给我们创建对象,当创建IOC容器对象的时候,会自动加载读取配置文件(本文中是applicationContext.xml),而在配置文件(applicationContext.xml)中,里面指定了要扫描的所有指定的包,然后就会去扫描Test类,然后扫描Test类的时候,发现@Autowire注解,Spring会理解为用户想要创建对象,然后就去创建IOC,然后读取配置文件,然后…………所以永远不会停止。

所以,永远不要妄想在测试类中让Spring给你注入属性!!!

原文地址:https://www.cnblogs.com/zhqin/p/11729657.html

时间: 2024-10-09 01:21:34

Spring框架入门浅析的相关文章

Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=63 https://www.zhihu.com/question/29444491/answer/146457757 1. Java - Struts框架教程Struts 是Apache软件基金会(ASF)赞助的一个开源项目.通过采用JavaServlet/JSP技术,实现了基于Java EEWeb

1.Spring框架入门

**Spring框架的IOC核心功能快速入门(必须掌握开发的步骤)** 0. 什么是IOC的功能? * IOC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!! * 使用IOC可以解决的程序耦合性高的问题!! 1. 步骤一:下载Spring框架的开发包 * 下载路径为:http://repo.spring.io/webapp/search/artifact/?0&q=spring-framework * 解压后的目录结构如下 * docs -- API和

Spring框架入门:(非原著,转载)

1.1.      耦合性和控制反转: 对象之间的耦合性就是对象之间的依赖性.对象之间的耦合越高,维护成本越高.因此,对象的设计应使类和构件之间的耦合最小. 例: public interface ICustomerDao{      //接口 public boolean getCustomerByAccount(); } public class CustomerDao implements ICustomerDao{ /*实现代码*/ } public class BeanFactory{

Spring框架入门

1.1专业术语了解 组件/框架设计 侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:     Struts框架  继承ActionSupport 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hibernate框架 / Spring框架 控制反转: 控制反转 ,IOCInversion on Control 对象的创建交给外部容器完成,这个就做控制反转. 原本在业务逻辑层里面,需要得到DAO的实现,要么在业务逻辑层直接new,要么使用工厂获取一个.

使用Spring框架入门一:基于XML配置的IOC/DI的使用

一.Spring框架 1.方法一:逐项导入基础依赖包: spring-core.spring-beans.spring-context.spring-expression 2.方法二:最简洁的导入,直接导入spring-context包: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version&g

spring框架入门之一

一.什么是Spring框架 1.什么是Spring Spring框架是个一个全栈的框架.意思就是使用Spring的框架可以开发web层,service层还有dao层. 本质:Spring就是一个对象的容器,因为在这个容器中有可以处理请求的对象,所以可以用来写web层,因为有service层对象,所以可以用来写service层,因为有dao层对象,所以可以用来操作数据库. Spring的开放性和包容性非常强大,可以进行无缝整个第三方优秀的框架,不会重复造轮子. Spring框架的结构: Sprin

Spring - 框架入门

认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程). 什么是 Spring: ① Spring 是一个轻量级的 DI / IoC 和 AOP 容器的开源框架, 来源于 Rod Johnson 在其著作<Expert one on one J2EE design and devel

1.Spring框架入门案例

一.简单入门案例 入门案例:IoC 1.项目创建与结构 2.接口与实现类 User.java接口 package com.jd.ioc; /** * @author weihu * @date 2018/8/8/008 22:29 * @desc 用户接口 */ public interface User { void addUser(); } UserImpl.java实现类 package com.jd.ioc.impl; import com.jd.ioc.User; /** * @aut

使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用

一.简述 本文主要讲使用注解+xml配合使用的几种使用方式.基础课程请看前一节. 二.步骤 1.为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依赖包spring-beans\spring-core\spring-expression\spring-context. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http: