目录
- 前置工作
- 更加简单的存储Bean对象
- 类注解存储Bean命名问题
- Java项目标准分层
- 五大类注解之间的关系
- 方法注解@Bean
- 重命名@Bean的几种方式
前置工作
在spring-config.xml添加如下配置:
配置bean的扫描根路径:只有当前目录下的类才会扫描是否添加了注解,如果添加了注解,就将这些加了注解的类,存放到IoC容器中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.java.demo">
</content:component-scan>
</beans>
更加简单的存储Bean对象
两种方法:
1.通过类注解实现Bean对象的存储;
@Controller:控制器,验证用户请求的数据正确性(安保系统)
@Service:服务层,编排和调度具体执行方法的(客服中心)
@Repository:持久层,和数据库进行交互,等同于DAO(Data Access Object) 数据访问层
@Component:组件(工具类)
@Configuration:配置项(配置项目中的一些配置)
2.通过方法注解实现Bean对象的存储
@Bean路径
使用@Controller(控制器存储)
package com.java.demo;
import org.springframework.stereotype.Controller;
@Controller(value = "userinfo")
public class User {
public void sayHi() {
System.out.println("Hi,User~");
}
}
import com.java.demo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@SuppressWarnings({"all"})
public class App {
public static void main(String[] args) {
// 1. 得到容器对象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 得到 Bean 对象
User user = context.getBean("userinfo", User.class);
// 3. 使用 Bean 对象
user.sayHi();
}
}
import com.java.demo.Student;
import com.java.demo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@SuppressWarnings({"all"})
public class App {
public static void main(String[] args) {
// 1. 得到容器对象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 得到 Bean 对象
// User user = context.getBean("userinfo", User.class);
Student student = context.getBean("student", Student.class);
// 3. 使用 Bean 对象
// user.sayHi();
student.sayHi();
}
}
原因就是:student没有加注解。
使用注解和XML是可以一起使用的。
类注解存储Bean命名问题
默认类名首字母小写就能获取到Bean对象。
获取不到Bean对象
使用原类名,可以获取到Bean对象
我们在获取Bean对象时,传入名称时,一般分为两种情况:
默认情况下:使用原类名首字母小写就能读取到Bean对象
特殊情况:如果不满足首字母大写和第二个字母小写的情况,那么使用原类名获取
Java项目标准分层
五大类注解之间的关系
方法注解@Bean
a.使用注意事项:@Bean 注解 必须要配合五大类注解一起使用
package com.java.demo.model;
import java.time.LocalDateTime;
@SuppressWarnings({"all"})
/**
* 普通的文章实体类
*/
public class ArticleInfo {
private int aid;
private String title;
private String content;
private LocalDateTime createtime;
public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public LocalDateTime getCreatetime() {
return createtime;
}
public void setCreatetime(LocalDateTime createtime) {
this.createtime = createtime;
}
@Override
public String toString() {
return "ArticleInfo{" +
"aid=" + aid +
", title='" + title + '\'' +
", content='" + content + '\'' +
", createtime=" + createtime +
'}';
}
}
package com.java.demo;
import com.java.demo.model.ArticleInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import java.time.LocalDateTime;
@SuppressWarnings({"all"})
@Controller
public class Articles {
@Bean // 将当前方法返回的对象存储到 IoC 容器
public ArticleInfo articleInfo() {
// 伪代码
ArticleInfo articleInfo = new ArticleInfo();
articleInfo.setAid(1);
articleInfo.setTitle("今天周几?");
articleInfo.setContent("今天周一!");
articleInfo.setCreatetime(LocalDateTime.now());
return articleInfo;
}
}
import com.java.demo.UConfig;
import com.java.demo.example.Teacher;
import com.java.demo.model.ArticleInfo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@SuppressWarnings({"all"})
public class App {
public static void main(String[] args) {
// 1. 得到容器对象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 得到 Bean 对象
// User user = context.getBean("userinfo", User.class);
// Student student = context.getBean("student", Student.class);
// UserService userService = context.getBean("userService",UserService.class);
// Teacher teacher = context.getBean("teacher",Teacher.class);
// UConfig uConfig = context.getBean("UConfig",UConfig.class);
ArticleInfo articleInfo = context.getBean("articleInfo", ArticleInfo.class);
// 3. 使用 Bean 对象
// user.sayHi();
// student.sayHi();
// userService.sayHi();
// teacher.sayHi();
// uConfig.sayHi();
System.out.println(articleInfo);
}
}
b.@Bean 获取时注意事项:@Bean的默认命名=方法名。
重命名@Bean的几种方式
方式1:@Bean("aaa")
方法2:@Bean(name = "aaa")
方式3:@Bean(value = "aaa")
重命名扩展:@Bean 支持指定多个名称
@Bean(value = {“aaa”})
默认命名注意事项:当@Bean重命名之后,那么默认的使用方法名获取Bean对象的方式就不能使用了。