注解介绍
- 代码里的特殊标记,使用注解可以完成功能
- 写法:@注解名称(属性名称=value)
- 注解使用在 类上面,方法上面,属性上
- 作用:替代配置文件完成对象生成,属性注入,但是注解并不能完全脱离配置文件
Spring注解开发准备
- applicationContext.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 http://www.springframework.org/schema/context/spring-context-4.0.xsd">
</beans>
- 约束中开启注解扫描
<?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 http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--开启注解扫描,base-package中写要扫描的包,如果有多个包,用逗号隔开或者写包的共同前缀-->
<!--扫描包里面的类、方法、属性上是否有注解-->
<context:component-scan base-package="\"></context:component-scan>
</beans>
注解创建对象
import org.springframework.stereotype.Component;
@Component(value="person") //等于<bean id="user" class = "Person"/>
public class Person{
public void say(){
System.out.println("hi");
}
}
public class test {
public static void main(String args []){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person");
person.say();
}
}
创建对象一共有4个注解
- @Component
- @Controller:WEB层
- @Service : 业务层
- @Repository:持久层
目前这四个注解功能一样
创建单实例对象:
@Component(value="person") //等于<bean id="user" class = "Person"/>
@Scope(value = "singleton") //prototype创建多实例
public class Person{
public void say(){
System.out.println("hi");
}
}
public class test {
public static void main(String args []){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person1 = (Person) context.getBean("person");
Person person2 = (Person) context.getBean("person");
System.out.println(person1==person2);
}
}
结果:image.png
注解注入属性
- 注解注入对象
场景:Service中注入Dao对象
@Component("studentDao")
public class studentDao {
public void say(){
System.out.println("this is dao");
}
}
@Service("studentService")
public class StudentService {
//在SerVice中注入Dao对象
//创建Dao类型的属性,在属性上使用@Autowired实现对象注入(自动装配)
@Autowired
private studentDao studentDao;
public void say2(){
System.out.println("this is Service");
studentDao.say();
}
}
其实更常用对象注入的注解是:@Resource(name=" ")
@Service("studentService")
public class StudentService {
//在SerVice中注入Dao对象
//创建Dao类型的属性,在属性上使用@Resource实现对象注入
@Resource(name = "studentDao")
private studentDao studentDao;
public void say2(){
System.out.println("this is Service");
studentDao.say();
}
}
测试:
public class test {
public static void main(String args []){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentService studentService = (StudentService) context.getBean("studentService");
studentService.say2();
}
}
结果:image.png