目录
一、通过注释配合Bean
- 通过配置context的publicId,Uri即定义的名字空间的前缀context
pubilicId
http://www.springframework.org/schema/context
Uri
https://www.springframework.org/schema/context/spring-context.xsd
名字空间
xmlns:context="http://www.springframework.org/schema/context
beanFactory.xml
<?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:context="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">
</beans>
1.Component注释
我们在beanFactory.xml中添加Component-scan标签,指定spring扫描哪些包下的所类中的注解(包括包下的子包)
<context:component-scan base-package="edu.xalead"/>
User实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private int id;
private String name;
private int age;
private String sex;
}
测试
- 我们用名字去取,
工厂默认配置的名字为实体类名第一个字母小写
User --> user
public void test1(){
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
Object user = beanFactory.getBean("user");
System.out.println(user);
}
我们也可以指定名字,在通过指定的名字取
@Component("user")
public class User {
private int id;
private String name;
private int age;
private String sex;
}
- 我们也可以通过类去取
public void test1(){
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
User user = beanFactory.getBean(User.class);
System.out.println(user);
}
结果是一样的
2.和@Compent功能一样的注解
@Controller 主要用到web层
@Service 服务service层
@Repository 数据访问层 dao层
他们本质其实是一样的,相当于一个别名,由于我们在开发的时候要分层,为了在项目中好区分,所以起了不一样的名字
3.Value注解
@Value("2020")
private int id;
@Value("张三")
private String name;
@Value("18")
private int age;
@Value("男")
private String sex;
但其实这样注解没有什么意义,我们完全可以自己赋值,而且还比这样方便,所以我们一般不使用它
private int id = 2020;
至于集合我们只能用xml配置,无法用Value来注释
private String[] photos;
private List<String> list;
private Set<String> set;
private Map<Integer , String> map;
4.Scope注释指定单例或多例
@Scope默认是单例模式,即scope=“singleton”,我们可以不写
@Scope("singleton")
public class User {}
scope="prototype"为多例模式
@Scope("prototype")
public class User {}
另外scope还有request、session、global session作用域。
5. @Autowired、@Qualifier(“ser”)、@Resource
假设我想在UserServlet中注入UserDao,我们首先将这两个类都放入工厂中,之后子将userDao注入UserServlet中
UserDao实体类
@Component
public class UserDao {
public User findUser(){
User user = null;//new User(1000, "张三", 18, "男","2000-01-01");
return user;
}
}
UserServlet实体类
@Component
public class UserServlet {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
public void findUser(){
System.out.println("Spring工厂示例");
System.out.println(userDao.findUser());
}
}
或者我们直接使用@Resource
@Component
public class UserServlet {
@Resource("userDao")
private UserDao userDao;
public void findUser(){
System.out.println("Spring工厂示例");
System.out.println(userDao.findUser());
}
}
若我们有一个接口UserDao,两个实现了接口UserDao,那我们需要用不同的名字来注入,比如像这样
@Resource("userDao1")
@Resource("userDao2")
我们大多数情况都是用@Resource
6.生命周期相关注解
我们可以在任何类中加入声明周期的执行,比如初始化、销毁
- 初始化:@PostConstruct
@PostConstruct
public void init(){};
- 销毁:@PreDestroy
@PreDestroy
public void destroy(){};
若有误,请指教!