Spring到底是什么东西呢?Java中常说的Spring能干些啥?

Spring到底是什么东西呢?Java中常说的Spring能干些啥?

什么是spring?

1、spring在百度百科是这样介绍的:Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。 工作需要,需要用到Java语言,自学没多久,看到Spring框架的时候,就觉得挺模糊的,什么是框架,能干什么,为什么要用框架而不直接用包和类实现各个模块呢? 在了解spring之前,先了解一下JAVABEAN。JavaBean是用java语言写的一种组件,我们可以使用JavaBean中的属性、方法和事件。换一种说法就是JavaBean就是你知道他的功能是什么,用就好了,而不必管它的实现。 然后Spring呢,就是用来装JavaBean的一种容器。说白了就是用来管理JavaBean实例化对象的一种容器。

spring中使用JavaBean

1、首先需要添加springIDE插件,配置相关依赖,具体教程网上遍地是,这里附上一个(spring-IDE插件配置)。

pom.xml (1.spring-context 2.spring-orm 3.spring-web 4.spring-aspects)

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

zking

s1

war

0.0.1-SNAPSHOT

s1 Maven Webapp

http://maven.apache.org

junit

junit

3.8.1

test

org.springframework

spring-context

5.0.1.RELEASE

org.springframework

spring-web

5.0.1.RELEASE

org.springframework

spring-orm

5.0.1.RELEASE

org.springframework

spring-aspects

5.0.1.RELEASE

s1

2、 插件Spring的xml文件(右键–>new–>other–>spring–>Spring Bean Configuration File) 注:创建spring的XML文件时,需要添加beans/aop/tx/context标签支持(勾上即可)

ApplicationContext.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

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

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

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

3、随便创建一个类

package test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloWorld {

private String name;

public HelloWorld() {

super();

System.out.println("new HelloWorld()");

}

public HelloWorld(String name) {

super();

this.name = name;

}

public void init() {

System.out.println("init.......");

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

如何在spring当中配置定义一个JavaBean

使用无参构造方法+set方法创建一个JavaBean 1 id:在容器中查找Bean(对象)的id(唯一、且不能以/开头) 2 class:bean(对象)的完整类名 3 name:在容器中查找Bean(对象)的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开) 4 scope:(singleton|prototype)默认是singleton 4.1 singleton(单例模式):在每个Spring IoC容器中一个bean定义对应一个对象实例 4.2 prototype(原型模式/多例模式):一个bean(对象)定义对应多个对象实例 4 abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象bean,非抽象类也可以定义成抽象bean 5 parent:指定一个父bean(必须要有继承关系才行) 6 init-method:指定bean对象()的初始化方法 7 使用有参数构造方法创建javaBean(java对象):constructor-arg

然后再xml创造bean

zs

之后写一个main测试一下即可。

public static void main(String[] args) {

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("ApplicationContext.xml");

HelloWorld a = (HelloWorld)applicationContext.getBean("a");

System.out.println("你好: "+a.getName());

HelloWorld b = (HelloWorld)applicationContext.getBean("b");

System.out.println("你好: "+b.getName());

HelloWorld c = (HelloWorld)applicationContext.getBean("c");

System.out.println("你好: "+c.getName());

HelloWorld d = (HelloWorld)applicationContext.getBean("helloworld2");

System.out.println("你好: "+d.getName());

}

Spring 容器会自动完成@bean对象的实例化。

创建应用对象之间的协作关系的行为称为:装配(wiring),这就是依赖注入的本质。

Spring 三种配置方案

1.在XML中进行显示配置 2.使用Java代码进行显示配置 3.隐式的bean发现机制和自动装配

鉴于第三种方法比较常用,这里实现一下第三种方法: 1.组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的bean。 2.自动装配(autowiring):Spring自动满足bean之间的依赖。

package com.stalkers;

/**

* CD唱片接口

* Created by stalkers on 2016/11/17.

*/

public interface ICompactDisc {

void play();

}

package com.stalkers.impl;

import com.stalkers.ICompactDisc;

import org.springframework.stereotype.Component;

/**

* Jay同名专辑

* Created by stalkers on 2016/11/17.

*/

@Component

public class JayDisc implements ICompactDisc {

private String title = "星晴";

public void play() {

System.out.println(title + ":一步两步三步四步,望着天上星星...");

}

}

Component注解作用: 表明该类会作为组件类。

不过,组件扫描默认是不开启用的,我们还需要显示配置下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。

1.java code开启组件扫描: 其中,如果CompoentScan后面没有参数的话,默认会扫描与配置类相同的包

@Configuration

@ComponentScan

public class CDPlayerConfig {

@Bean

public ICompactDisc disc() {

return new JayDisc();

}

}

2.xml启动组件扫描

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

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

测试代码

package com.stalkers;

import com.stalkers.config.CDPlayerConfig;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**

* Created by stalkers on 2016/11/18.

*/

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = CDPlayerConfig.class)

public class TestPlay {

@Autowired

private ICompactDisc jayDisc;

@Test

public void play() {

jayDisc.play();

}

}

在ComponentScan扫描的包中,所有带有@Component注解的类都会创建为bean

为组件扫描的bean命名 Spring应用上下文种所有的bean都会给定一个ID。在前面的例子中,尽管我们没有明确地为JayDisc bean设置ID,但是Spring会默认为JayDisc设置ID为jayDisc,也就是将类名的第一个字母变成小写。

如果想为这个bean设置不同的ID,那就将期望的值传递给@Component注解

@Component("zhoujielun")

public class JayDisc implements ICompactDisc {

...

}

如果不使用@Component注解的话,则使用Java依赖注入规范(Java Dependency Injection)中所提供的@Named注解bean的ID。

需要引入:

javax.inject

javax.inject

1

@Named("zhoujielun")

public class JayDisc implements ICompactDisc {

....

}

设置组件扫描的基础包 前面再给CDPlayerConfig类设置@ComponentScan,我们并没有设置任何属性,这个时候默认扫描默认包是:CDPlayerConfig类所在包及其包的子包。

如果是下图这种情况,DisConfig与其这时候就需要设置@ComponentScan的扫描的包。

@Configuration

@ComponentScan(basePackages = {"com.stalkers.soundsystem"})

public class DiscConfig {

}

basePackages使用的是复数,则意味着可以设置多个基础包。

但是basePackages后面跟的是String类型,这种类型并不安全。可以使用basePackageClasses有下面这种写法:

@Configuration

@ComponentScan(basePackageClasses = {com.stalkers.soundsystem.JayCompactDisc.class})

public class DiscConfig {

}

通过为bean添加注解实现自动装配 如果所有的对象都是独立的,彼此之间没有任何依赖,那么使用组件扫描就能自动化装配bean。

但是实际工作中,很多对象会依赖其他对象完成任务。这时候就需要能够将组件扫描得到的bean和他们依赖装配在一起。这就是自动装配(autowiring)

使用Spring的Autowired

public interface IMediaPlayer {

void play();

}

@Component

public class CDPlayer implements IMediaPlayer {

private ICompactDisc cd;

@Autowired

public CDPlayer(ICompactDisc cd) {

this.cd = cd;

}

public void play() {

System.out.println("cd Play:");

cd.play();

}

CDPlayer类的构造器上添加了@Autowired注解,表明当Spring创建CDPlayerbean的时候,会通过这个构造器来进行实例化

Autowired的多种方式 1.构造器注解(constructor)

2.属性setter注解

3.field注解

不管使用上面3中的哪个方法,Spring都会满足声明的依赖。假如有且只有一个bean匹配依赖的话,那么这个bean将会被装配进来。

如果使用2,3方式注解,有多个bean的话,则用Qualifier指定。

如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。为了避免异常的出现,可以使用

@Autowired(required = false)

private IMediaPlayer CDPlayer;

required=false表示如果没有匹配的话,Spring会让bean处于未装配的样子。使用未装配的属性,会出现NullPointerException

总结: 所以在使用开发的时候一般建议使用Resource(package javax.annotation)进行注解。但是Resource不支持构造器注解