Spring 学习笔记 - Part3 学习资源来自B站黑马程序员: https://www.bilibili.com/video/BV1Fi4y1S7ix/?p=20&share_source=copy_web&vd_source=c76bb3d6e0326c966bf1bf32db90eb22
注解开发 注解开发定义bean **1. 直接在类名上面添加注解, 使用 @Component()
定义 bean **
1 2 3 4 5 6 7 @Component("bookDao") public class BookDaoImpl implements BookDao { @Override public void save () { System.out.println("book dao save" ); } }
2. 配置文件增加context命名空间,用命名空间扫描对应类的package
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?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 " > <context:component-scan base-package ="com.dao.impl" /> </beans >
3. 主程序调用不变
1 2 3 4 5 6 7 public class App2 { public static void main (String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext ("applicationContext.xml" ); BookDao bookDao = (BookDao) ctx.getBean("bookDao" ); bookDao.save(); } }
Spring提供@Component注解的三个衍生注解
@Controller:用于表现层bean定义
@Service:用于业务层bean定义
@Repository:用于数据层bean定义
纯注解开发 用java类代替Spring核心配置文件
1. 创建配置类,SpringConfig
其中 @Configuration
替代了之前xml文件里的基础配置。
@ComponentScan("com.dao.impl")
替代了之前xml文件里的扫描指令, <context:component-scan base-package="com.dao.impl"/>
1 2 3 4 @Configuration @ComponentScan("com.dao.impl") public class SpringConfig {}
2. 主程序调用
1 2 3 4 5 6 7 8 9 public class AppForAnnotation { public static void main (String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (SpringConfig.class); BookDaoImpl bookDao = (BookDaoImpl) ctx.getBean("bookDao" ); bookDao.save(); } }
@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式,如:@ComponentScan({"com.service","com.dao"})
容器对象的获取:AnnotationConfigApplicationContext
依赖注入-自动装配 引用类型 一般使用@autowired
进行装配。如果有多个同类型,在类型的@Repository带上名称参数,@autowired 和 @Qualifier(“classname”) 配合实现。
自动装配基于反射涉及创建对象,并暴力反射对应属性为私有属性初始化数据,因此无需setter方法。
使用@Autowired注解开启自动装配模式(按类型)
1 2 3 4 5 6 7 8 9 10 11 12 @Servcie public class BookServiceImpl implements BookService{ @Autowired private BookDao bookDao; public void setBookDao(BookDao bookDao){ this.bookDao=bookDao; } public void save(){ System.out.print("book service save ..."); bookDao.save(); } }
注意:自动装配基于反射设计创建对象并暴力反射对应属性初始化数据,因此无需提供setter()方法
注意:自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
使用@Qualifier注解开启指定名称装配bean
1 2 3 4 5 6 @Service public class BookServiceImpl implements BookService{ @Autowired @Qualifier("bookDao") private BookDao bookDAO; }
注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用
简单数据类型注入
基础类型 基础类型直接使用 @Value()
赋值。
读取外部参数 在springconfig
文件中,增加@PropertySource({})
中 括号内为参数文件路径,注入时使用 ${}
括号内填写参数文件中对应的变量名。
在定义的数据类型上放使用@Value("值")
在SpringConfig类下,使用@PropertySource注解加载properties文件
1 2 3 4 @Configuration @ComponentScan("com") @uPropertySource("classpath:jdbc.properties") public class SpringConfig{}
1 2 @Value("${外部文件中定义的属性名}") private String value;
注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*
管理第三方bean 写法一
1 2 3 4 5 6 7 8 9 10 11 12 13 @Configuration public class SpringConfig { @Bean public DataSource dataSource () { DruidDataSource ds = new DruidDataSource (); ds.setDriverClassName("com.mysql.jdbc.Driver" ); ds.setUrl("jdbc:mysql://localhost:3306/spring_db" ); ds.setUsername("root" ); ds.setPassword("root" ); return ds; } }
主程序调用
1 2 3 4 5 6 7 8 public class AppForAnnotation { public static void main (String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext (SpringConfig.class); DataSource dataSource = ctx.getBean(DataSource.class); System.out.println(dataSource); } }
1 2 3 4 5 6 7 8 public class JdbcConfig { @Bean public DataSource dataSource () { DruidDataSource ds = new DruidDataSource (); return ds; } }
使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式
1 2 3 4 @Configuration @Import(JdbcConfig.class) public class SpringConfig {}
第三方bean依赖注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class JdbcConfig { @Value("com.mysql.jdbc.Driver") private String dirver; @Value("jdbc:mysql://localhost:3306/spring_db") private String url; @Value("root") private String userName; @Value("505489") private String password; @Bean public DataSource dataSource () { DruidDataSource ds = new DruidDatSource (); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUserName(userName); ds.setPassword(password); return ds; } }
1 2 3 4 5 6 7 @Bean public DataSource dataSource (BookService bookService) { Sytstem.out.print(bookService); DruidDataSource ds = new DruidDataSource (); return ds; }
引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象