Spring 中使用注解注入
注解:就是一个类,使用
@
注解名称。实际开发中:使用注解取代 xml 配置文件。
1、常用注解释义
@component
取代 <bean class=””>
@Component(“id”)
取代 <bean id=”” class=””>
web 开发,提供 3 个 @Component 注解衍生注解取代 <bean class=””>
@Repository(“名称”):dao 层
@Service(“名称”):service 层
@Controller(“名称”):web 层
web 开发中其他常用注解
@Autowired:自动根据类型注入
@Qualifier(“名称”): 指定自动注入的 id 名称
@Resource(“名称”)
@ PostConstruct 自定义初始化
@ PreDestroy 自定义销毁
2、案例代码演示
接口和实现类
public interface UserService {void add(User user);
}
=========================================================================================
@Component
public class UserServiceImpl implements UserService {
@Override
public void add(User user) {System.out.println("添加用户信息..."+user);
}
}
配置 bean.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.xsd">
<!-- 开启注解 -->
<context:annotation-config/>
<!-- 注解的位置 -->
<context:component-scan base-package="com.example.demo"/>
</beans>
测试函数
public class ServiceTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean(UserServiceImpl.class);
User user = new User();
user.setUsername("元始天尊");
user.setAge(999);
user.setPassword("555");
userService.add(user);
}
}
控制台日志信息如下:
添加用户信息 …User{username=’ 元始天尊 ’, password=’555′, age=999}
3、重点:注解是如何取代 xml 中 bean 的配置
a、在类中声明 @Component 相当于配置了:
<bean class="com.example.demo.service.impl.UserServiceImpl"></bean>
b、Spring 默认情况下注解不生效,需要开启注解功能:
<!-- 开启注解 --> <context:annotation-config/> <!-- 注解的位置 --> <context:component-scan base-package="com.example.demo"/>
c、使用注解时 需注意 bean.xml 配置的约束文件,否则不会生效:
4、还可以使用以下配置
@Component("userService")
public class UserServiceImpl implements UserService {
private String name;
public void setName(String name) {this.name = name;}
@Override
public void add() {System.out.println("创建用户...." + name);
}
@Override
public void add(User user) {System.out.println("添加用户信息..."+user);
}
}
public class ServiceTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService)context.getBean("userService");
User user = new User();
user.setUsername("元始天尊");
user.setAge(999);
user.setPassword("555");
userService.add(user);
}
}
2 种运行的结果都是一样的。
@Component(“userService”) 就是加上了 id,就相当于在 Spring 容器中注入的时候有了唯一的 id 号码,所以在获取的时候可以通过 id 获取,即
UserService userService = (UserService)context.getBean("userService");。