一篇文章带你掌握主流基础框架——Spring( 七 )


注解开发Bean
在前面的内容中 , 我们的bean在xml配置文件中装配
在后期 , 我们的bean可以采用注解的形式 , 直接在实现类中注解表示为bean
我们采用@Component定义bean , 可以添加参数表示id , 也可以不添加参数 , 后期我们采用class类的类型来进行匹配
package com.itheima.dao.impl; import com.itheima.dao.BookDao; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Repository; //@Component定义bean @Component("bookDao") public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } }package com.itheima.service.impl; import com.itheima.dao.BookDao; import com.itheima.service.BookService; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; //@Component定义bean @Component public class BookServiceImpl implements BookService { private BookDao bookDao; public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void save() { System.out.println("book service save ..."); bookDao.save(); } }
@Componenty延伸出了三种类型 , 在实现手法上是一致 , 但可以具体使用于各种类中(仅用于自我识别)
 

  • @Controller:用于表现层bean定义
  • @Service:用于业务层bean定义
  • @Repository:用于数据层定义
package com.itheima.dao.impl; import com.itheima.dao.BookDao; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Repository; //@Component定义bean //@Component("bookDao") //@Repository:@Component衍生注解 @Repository("bookDao") public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } }package com.itheima.service.impl; import com.itheima.dao.BookDao; import com.itheima.service.BookService; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; //@Component定义bean //@Component //@Service:@Component衍生注解 @Service public class BookServiceImpl implements BookService { private BookDao bookDao; public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void save() { System.out.println("book service save ..."); bookDao.save(); } } 
但是 , 在上述情况下 , 即使我们将@Component的类定义为bean
我们的xml文件是无法探测到的 , 所以我们需要配置相关扫描组件来扫描bean
纯注解开发
我们前面所提到的注解开发属于2.5的附属版本
在Spring3.0版本 , Spring就提供了纯注解开发模式 , 利用java类代替配置文件 , 开启了Spring快速开发时代
在之前我们的xml配置文件是很繁琐的:
但是我们可以通过创建单独的类来表示配置文件:
 
  • @Configuration:用于声明当前类为Spring配置类
  • @ComponentScan:用于扫描类文件(类似于)
package com.itheima.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; //声明当前类为Spring配置类 @Configuration //设置bean扫描路径 , 多个路径书写为字符串数组格式 @ComponentScan({"com.itheima.service","com.itheima.dao"}) public class SpringConfig { }
注意:因为该类属于配置类 , 我们通常单列一个文件夹来表示 常用文件夹:config 命名规范:SpringConfig,UserConfig...
 
因为我们的开发不再依靠于xml配置文件 , 所以在主函数中的Spring容器获得方式也发生了改变:
package com.itheima; import com.itheima.dao.BookDao; import com.itheima.service.BookService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { // 这是我们之前的获取方式 , 采用路径获取xml文件 // ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // 这是新的获取方式 , 直接提供配置类的类型 // AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器 ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); // 后面操作无需变化 BookDao bookDao = (BookDao) ctx.getBean("bookDao"); System.out.println(bookDao); //按类型获取bean BookService bookService = ctx.getBean(BookService.class); System.out.println(bookService); } }


推荐阅读