SpringIoC初探
在学习spring之前,最好对java基本语法(例如注解,反射机制),javaWeb的基本知识,xml,maven等有一定的了解.本博客只是起到大纲的作用,具体详细讲解可以查阅网上更多的资料,某些内容不作过多解释.
概述
1.DI(Dependency Injection依赖注入)这个概念替换传统的IoC依赖注入:让调用类某一接口实现类的依赖关系由第三方(容器或者协作类)注入,以移除调用类对某一接口实现类的依赖.
2.SpringIoC容器:通过配置文件或者注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作.即,我们在实践过程中就是通过编写xml文件和对某些类使用特定的注解来实现依赖注入.
BeanFactory和ApplicationContext
1.Bean工厂(Bean Factory)是spring框架中最核心的接口,提供了高级的IoC配置,而应用上下文(ApplicationContext)建立在BeanFactory之上.我们一般可以直接使用ApplicationContext而并非BeanFactory.
2.Spring中的bean:和一般我们说的javaBean有一些区别,所有可以被Spring容器实例化并管理的Java类我们都可以称为Bean.要想让Spring管理我们的Bean,我们可以通过注解或者配置xml文件来实现.
实践部分:使用xml配置初探SpringIoc
1.说明:本次实践使用的ide为IntelliJ IDEA,使用maven管理工具.
2.创建Spring项目:使用maven创建一个quickstart项目.
3.编写pom.xml:添加如下依赖,这里的spring.version可以替换为你想用的版本.
<!-- spring dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
4.编写一个Product的bean:在java的目录(我这里是在com.dadagum下,这取决于你创建maven项目时的命名)下创建bean包,然后创建Product类:
package com.dadagum.bean;
public class Product {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.在main下创建目录resources,在下面创建applicationContext.xml文件,内容如下(你可以提前了解xml的命名空间和schema等知识,让你看这些配置文件没有那么头疼):
<?xml version="1.0" encoding="UTF-8"?>
<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">
<bean id = "product" class="com.dadagum.bean.Product">
<property name="name" value="test"/>
<property name="id" value="1"/>
</bean>
</beans>
6.测试:直接修改App.java内容,运行:
package com.dadagum;
import com.dadagum.bean.Product;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Product product = context.getBean("product",Product.class);
System.out.println(product.getId() + " " + product.getName());
}
}
output:1 test
7.注意:①要想自己的bean交给spring容器管理,需要在xml配置中定义这个bean;如果这个bean中某些成员是引用类型的,可以使用ref进行关联(详细可以参考其他资料).
使用注解简化xml文件配置
1.@Component,@Service,@Repository,@Controller注解(区别和作用可自行查阅):
packeage com.dao
@Component
public class Product{
}
等价于下面在xml文件中的定义
<bean id = "product" class="com.dao.Product"/>
注意,如果注解@Component中没有指定bean的value,那么默认这个bean的id就是第一个字母小写的类名,如上.
2.@Autowired自动注入
@Component
public class Stock{
@Autowired
private Product item;
}
上述也可以为product写一个set方法,然后在方法上添加@Autowired注解,效果是一样的.上述的效果等价于xml文件中的
<bean id = "stock" class = "XXX">
<property name = "item" ref = "product"/>
</bean>
3.自动扫描包:bean使用注解(如@Component)+在xml文件中敲下以下代码即可让spring自动管理你的bean(需要添加命名空间和schema文件的url)
<context:component-scan base-package="XXX"/>
当然你也可以利用正则表达式再细分包下需要spring管理的bean,详细可查阅网上资料.