Spring02_Spring0配置

一、Spring 0配置开发

​ 从 Spring3.0 版本开始,Spring 框架尽量不再使用 Spring 配置文件来配置管理任何 Bean,而是采用自动搜索 某些路径下的 Java 类,并将这些 Java 类注册成 Bean 示例。并使用注解 Annotation 的方式来标注要管理的 Bean.

​ Spring 要求程序开发人员显示的指定搜索哪些路径下的 Java 类,对于该路径下的 Java 类如果使用了 Annotation 注解标注了该类,Spring 容器则会认为这是需要管理的 Bean 类。Spring 提供了如下几个 Annotation 注解来标注 Java 类。

​ @Component:标注一个普通的 Spring Bean 类。

​ @Controller:标注一个控制器组件类。

​ @Service:标注一个业务逻辑组件类。

​ @Repository:标注一个 DAO 组件类。

​ 使用 0 配置开发需要使用到 context 命名空间,引入后需要使用该命名空间下的 component-scan 元素中的 base-package 属性执行要扫描的包。

copy
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"

(一)@Component 注解开发

​ 以下面的 Person 为例,分别测试加注解和不加注解的两种情况。

copy
public class PersonTest { @Test public void testComponent () { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-beans.xml"); Person person = applicationContext.getBean(Person.class); System.out.println(person); } @Before public void setUp() throws Exception { Calendar calendar = Calendar.getInstance(); System.out.println(calendar.get(Calendar.HOUR)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND)); } @After public void tearDown() throws Exception { } }

image-20230412161811138

​ 使用 @Value 注解可以为属性赋值,如下:

image-20230412162119833

​ @Component、@Service、@Repository 注解类中都包含一个 name 属性,用于指定 Bean 在 Spring 容器 中的 id 值,@value 注解用于为 Bean 的成员变量指定基本数据类型和字符串的值,@Resource 注解用于为 Bean 的成员变量指定 Spring 容器中的其他 Bean 对象引用,@Scope 注解用于指定 Bean 的作用域。

(二)@Autowired 自动配置

​ 使用 @Autowird 注解开发即解决 DI 的问题,之前都是用 ref 指向一个 bean 或者使用 ByName / ByType 进行简化,如果使用注解@Resource,并且在@Resource 中使用了 name 属性指定了配置依赖,在 Spring 容器没有发现依赖时,会导致应用程序抛出异常,所以推荐使用注解 @Autowired 进行自动配置。

​ 如果在 Spring 中先按照 byName 的方式去匹配,如果没有匹配到,再按照 byType 的方式去匹配,如果都没有匹配到才会抛出异常。而且使用 @Autowired 注解时,对应的成员变量在 Bean 类定义中都不需要提供 get 和 set 方法就可以。

copy
import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Data @Component("user") public class User { @Value("500") private int age; @Value("yaoooo") private String name; @Autowired private Role role; } import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //@Data 为了验证上面的可以省略 get set所以将 Lombok 注释,顺便重写以下 role 的 toString @Component("role") public class Role { /** * 角色名称 */ @Value("芜湖~") private String roleName; /** * 角色代码 */ @Value("嗨害害") private String roleCode; public Role(String roleName, String roleCode) { this.roleName = roleName; this.roleCode = roleCode; } public Role() { } @Override public String toString() { return "Role{" + "roleName='" + roleName + '\'' + ", roleCode='" + roleCode + '\'' + '}'; } } }

image-20230413095158775

二、模拟注解开发实例

​ 使用几个简单的类模拟 service 调用 dao 进行业务逻辑处理。

copy
//使用 BookService com/qlu/bean/Book.java com/qlu/dao/BookDao.java com/qlu/dao/impl/BookDaoImpl.java com/qlu/service/BookService.java com/qlu/service/impl/BookServiceImpl.java //他奶奶滴,我说怎么报错没有bean,注释上到接口上了
copy
<!--前面都一样就不写了--> <context:component-scan base-package="com.qlu"></context:component-scan>
copy
import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) public class Book { private String name; private String author; private double price; }

​ 在 dao 里面瞎写点数据放进去,给两个类标上 Component 的注释,数据持久层就是 @Repository,业务逻辑就是 @Service,都是和 Component 一样的,不过给人看能明白是干什么的。

copy
public interface BookDao { /** * find * @return */ List<Book> findAll(); } import java.util.ArrayList; import java.util.List; @Repository("bookDao") public class BookDaoImpl implements BookDao { @Override public List<Book> findAll() { ArrayList<Book> books = new ArrayList<>(); for (int i = 0; i < 10; i++) { books.add(new Book().setName("java"+i).setAuthor("author"+i).setPrice(100+i)); } return books; } }

​ 使用 @Autowired 将 bookDao 注入到 Service 使用。

copy
@Service("bookService") public interface BookService { /** * 调用dao的 * @return */ List<Book> selectAll(); } @Service("bookService") public class BookServiceImpl implements BookService { @Autowired private BookDao bookDao; @Override public List<Book> selectAll() { return bookDao.findAll(); } }

​ 测试结果

image-20230413110059600

posted @   Purearc  阅读(21)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
🚀