一、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给你注入属性!!!

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

  1. 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=6 ...

  2. Spring框架入门之AOP

    Spring框架入门之AOP 一.Spring AOP简单介绍 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented ...

  3. Spring框架入门之Spring4.0新特性——泛型注入

    Spring框架入门之Spring4.0新特性——泛型注入 一.为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入. ...

  4. Spring框架入门之基于Java注解配置bean

    Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...

  5. Spring框架入门

    技术分析之什么是Spring框架        1. Spring框架的概述        * Spring是一个开源框架        * Spring是于2003 年兴起的一个轻量级的Java开发 ...

  6. spring框架入门day01

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少  --> [了解] spring ...

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

    1.1.      耦合性和控制反转: 对象之间的耦合性就是对象之间的依赖性.对象之间的耦合越高,维护成本越高.因此,对象的设计应使类和构件之间的耦合最小. 例: public interface I ...

  8. Spring框架入门之Spring简介

    一.Spring简介(由Rod Johnson创建的一个开源框架)        Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿 ...

  9. Spring MVC -- Spring框架入门(IoC和DI)

    Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...

随机推荐

  1. springBoot整合Sentinel实现降级限流熔断

    由于hystrix的停止更新,以及阿里Sentinel在历年双十一的贡献.项目中使用了Sentinel,今天我们来讲讲Sentinel的入门教程,本文使用1.6.3版本进行讲解 本文通过Sentine ...

  2. easyui中权限分配和添加 前后端代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. TurtleBot3 Waffle (tx2版华夫)(11)建图-karto建图

    1)[Remote PC] 启动roscore $ roscore 2)[TurBot3] 启动turbot3 $ roslaunch turbot3_bringup minimal.launch 3 ...

  4. 10分钟搞定让你困惑的 Jenkins 环境变量

    前言 Jenkins, DevOps 技术栈的核心之一,CI/CD 离不开编写 Pipeline 脚本,上手 Jenkins ,简单查一下文档,你就应该不会被 agent,stages,step 这类 ...

  5. JavaScript入门-学习笔记(二)

    关于js变量 变量,就是一个用来存储数据的容器 一般来说,我们的变量都是可以得先声明,再使用,就像是一个东西先必须存在,才能看得见摸得着.然而在js里(es5),可以先使用,后声明. a = 100; ...

  6. selenium爬虫 | 爬取疫情实时动态(二)

    '''@author:Billie更新说明:1-28 17:00 项目开始着手,spider方法抓取到第一条疫情数据,save_data_csv方法将疫情数据保存至csv文件1-29 13:12 目标 ...

  7. 微信小程序API交互的自定义封装

    目录 1,起因 2,优化成果 3,实现思路 4,完整代码 1,起因 哪天,正在蚂蚁森林疯狂偷能量的我被boss叫过去,告知我司要做一个线上直播公开课功能的微信小程序,博主第一次写小程序,复习了下文档, ...

  8. JS navigator.userAgent

    var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...

  9. 【Oracle】密码文件相关

    Oracle数据库的orapwd命令,主要用来建立密码(口令)文件. 一.查看帮助信息 [oracle@oracle11g dbs]$ orapwd Usage: orapwd file=<fn ...

  10. leetcode 886. 可能的二分法(DFS,染色,种类并查集)

    题目链接 886. 可能的二分法 题意: 给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 ...