注解开发定义bean:
package dao;
import dao.BookDao;
import org.springframework.stereotype.Component;
@Component("bookDao")
public class BookDaoImpl implements BookDao{
public void save(){
System.out.println("book dao save...");
}
}
核心配置文件applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置bean-->
<!-- <bean id="bookDao1" class="dao.BookDaoImpl"/>-->
<!-- <bean id="bookService" class="service.BookServiceImpl">-->
<!-- <!–配置Service与Dao的关系–>-->
<!-- <!–property标签表示配置当前bean的属性–>-->
<!-- <!–name属性表示配置哪一个具体对象的属性–>-->
<!-- <!–ref属性表示参照哪一个bean–>-->
<!-- <property name="bookDao" ref="bookDao1"/>-->
<!-- </bean>-->
<context:component-scan base-package="dao"/>
</beans>
主函数:
import dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.BookService;
import java.applet.AppletContext;
public class App2 {
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器,并加载配置文件
//获取bean
BookDao bookDao=(BookDao) ctx.getBean("bookDao");
// bookDao.save();
// BookService bookService=(BookService) ctx.getBean("bookService");
// bookService.save();
System.out.println(bookDao);
}
}
纯注解开发:Spring3.0开启了纯注解开发模式,使用Java类代替Spring核心配置文件,开启Spring快速开发通道
package config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"service","dao"})
public class springConfig {
}
package dao;
import dao.BookDao;
import org.springframework.stereotype.Component;
@Component("bookDao")
public class BookDaoImpl implements BookDao{
public void save(){
System.out.println("book dao save...");
}
}
import dao.BookDao;
import dao.BookDaoImpl;
import org.springframework.stereotype.Component;
import service.BookService;
import service.BookServiceImpl;
@Component()
public class BookServiceImpl implements BookService{
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
private BookDao bookDao;
public void save(){
System.out.println("book service save...");
bookDao.save();
}
}
@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
import config.springConfig;
import dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.BookService;
public class AppForAnnotation {
public static void main(String[] args) {
//加载配置类
ApplicationContext ctx= new AnnotationConfigApplicationContext(springConfig.class);
BookDao bookDao=(BookDao) ctx.getBean("bookDao");
System.out.println(bookDao);
BookService bookService=ctx.getBean(BookService.class);
System.out.println(bookService);
}
}
注解开发依赖注入:1.使用@Autowired注解开启自动装配模式
import dao.BookDaoImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import service.BookService;
import service.BookServiceImpl;
@Component()
public class BookServiceImpl implements BookService{
@Autowired
private BookDao bookDao;
public void save(){
System.out.println("book service save...");
bookDao.save();
}
}
主函数:
import config.springConfig;
import dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.BookService;
public class AppForAnnotation {
public static void main(String[] args) {
//加载配置类
ApplicationContext ctx= new AnnotationConfigApplicationContext(springConfig.class);
BookService bookService=ctx.getBean(BookService.class);
bookService.save();
}
}
注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
2.使用@Qualifier注解开启指定名称装配bean,但是@Qualifier注解无法单独使用,必须配合@Autowired注解使用
3.使用@Value实现简单类型注入
4.使用@PropertySource注解加载properties文件
注意:路径仅支持单一文件配置,例:@PropertySource("classpath:jdbc.properties")
多文件请使用数组格式配置,不允许使用通配符*
注解开发管理第三方bean:
1.使用@Bean配置第三方bean,使用独立的配置类管理第三方bean
2.将独立的配置类加入核心配置
方式一:导入式
使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式
方式二:扫描式
使用@ComponmentScan注解扫描配置类所在的包,加载对应的配置信息
注解开发实现为第三方bean注入资源
第三方bean引用类型依赖注入,引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
XML配置与注解配置对比
功能 | XML配置 | 注解 |
定义bean | bean标签 id属性 class属性 | @Component @Controller @Service @Repository @ComponentScan |
设置依赖注入 | setter注入(set方法) 引用类型/简单类型 构造器注入(构造方法) 引用类型/简单类型 自动装配 | @Autowired @Qualifier @Value |
配置第三方bean | bean标签 静态工厂、实例工厂、FactoryBean | @Bean |
作用范围 | scope属性 | @Scope |
生命周期 | 标准接口 init-method destory-method | @PostConstructor @PreDestory |