一、什么是注解
1、注解是代码特殊标记,格式:@注解名称(属性=属性值,属性=属性值…)
2、使用注解,注解的作用在类上面,方法上面,属性上面
3、使用注解的目的
为了简化xml的配置,让配置使用更优雅,更方便
二、Spring针对Bean管理中创建对象提供注解
1、@Component
@component是spring中的一个注解,它的作用就是实现bean的注入,@component取代。
2、@Service
一般用于我们的业务逻辑层,或者Service层上
3、@Controller
一般用于我们的Web层上
4、@Repository
一般用于我们的dao层
上面的四个注解,他们的功能是一样的,都可以用来创建Bean实例
三、基于注解方式实现对象创建
第一步:引入我们的依赖
将Spring-aop.5.2.6release.jar引入我们的lib包
第二步:开启组件扫描
xmlns:context=“http://www.springframework.org/schema/context”
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
第三步:创建类,在类上面我们创建对象注解
<?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">
<!-- 开启组件扫描 1、如果扫描多个包,使用逗号隔开
2、扫描包的上层目录
base-package="com.demo.spring5.dao,com.demo.spring5.service"
-->
<context:component-scan base-package="com.demo.spring5.dao,com.demo.spring5.service"></context:component-scan>
</beans>
@Component(value = "userService")
//==Component (value = "userService")可以省略,他会默认创建bean实例为UserService userService首字母小写
//==<bean id="userService" class="com.demo.spring5.service.UserService"/>
public class UserService {
public void add(){
System.out.println("service add.......");
}
}
@Test
public void Test01(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
UserService userService=context.getBean("userService",UserService.class);
System.out.println(userService); //com.demo.spring5.service.UserService@527e5409
userService.add(); //service add.......
}
总结:
首先,加载配置,在加载配置文件的时候,扫描到xml中配置的开启组件扫描, <context:component-scan…一生效,Spring就知道底下要用注解方式做到,就会到我们配置的包里面找到所有类,如果类上面有@Component相关的注解,就把你的对象创建,对象创建之后调用sout输出最终把这个过程完成。
四、开启组件扫描中的一些细节问题
<context:component-scan base-package="com.demo.spring5"></context:component-scan>
<!--示例 1
use-default-filters="false" 表示现在不使用默认filter,自己配置filters 默认true
使用use-default-filters="false"意思就是不使用默认filter,
context:include-filter表示扫描哪些内容
type=“annotation”表示类型为注解
expression="org.springframework.stereotype.Controller"表示扫描带Controller注解修饰的类
-->
<context:component-scan base-package="com.demo.spring5" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/><!--代表只扫描Controller注解的类-->
</context:component-scan>
<!--示例 2
下面配置扫描包所有内容
context:exclude-filter: 设置哪些内容不进行扫描
-->
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/><!--表示Controller注解的类之外一切都进行扫描-->
</context:component-scan>
五、基于注解方法实现属性的注入
(1)、AutoWired:表示根据你的属性类型进行自动装配
第一步:把service和dao对象创建,在Service和dao类添加对象注解
第二步:在Service注入dao对象,在service类添加dao类型属性,在属性上使用注解
public interface UserDao {
public void add();
}
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("若是情短,相思漫长");
}
}
@Service
public class User {
//定义dao类型属性 不需要添加Set方法 添加注入属性注解
@Autowired //根据类型进行注入
private UserDao userDao;
public void add(){
System.out.println("service add.......");
userDao.add();
}
}
@Test
public void Test01(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
User user=context.getBean("user", User.class);
System.out.println(user); //com.demo.spring5.service.User@4c1d9d4b
user.add();
/*service add.......
若是情短,相思漫长*/
}
(2)、Qualifier:表示根据你的属性名称进行自动装配
这个@Qualifier要和上面的@Aurowire一起使用,根据你的名称进行注入
当一个接口有多个实现类的时候,使用@Autowire不能指定使用哪个实现类,则我们必须要使用@Qualifier进行使用属性名称指定
@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("若是情短,相思漫长");
}
}
@Service
public class User {
//定义dao类型属性 不需要添加Set方法 添加注入属性注解
@Autowired //根据类型进行注入
@Qualifier(value = "userDaoImpl1") //根据你的名称进行注入
private UserDao userDao;
public void add(){
System.out.println("service add.......");
userDao.add();
}
}
(3)、Resource
可以根据类型注入,也可以根据名称注入
@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("若是情短,相思漫长");
}
}
@Resource //因为没有指定name所以是使用类型注入
private UserDao userDao;
public void add(){
System.out.println("service add.......");
userDao.add();
}
/*
com.demo.spring5.service.User@223f3642
service add.......
若是情短,相思漫长
*/
@Resource(name="userDaoImpl1") //根据名称注入
private UserDao userDao;
public void add(){
System.out.println("service add.......");
userDao.add();
}
/*
com.demo.spring5.service.User@223f3642
service add.......
若是情短,相思漫长
*/
(4)、Value
注入普通类型属性
java
@Value(value="abc")
private String name;