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 属性执行要扫描的包。
copyxmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
(一)@Component 注解开发
以下面的 Person 为例,分别测试加注解和不加注解的两种情况。
copypublic 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 {
}
}
使用 @Value 注解可以为属性赋值,如下:
@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 方法就可以。
copyimport 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 + '\'' +
'}';
}
}
}
二、模拟注解开发实例
使用几个简单的类模拟 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>
copyimport 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 一样的,不过给人看能明白是干什么的。
copypublic 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();
}
}
测试结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步