1.什么是注解
1.注解是代码特殊标记格式, @注解名称(属性名=属性值,属性名=属性值)
2.使用注解,注解在类,方法,属性上面
3.使用注解为了简化xml配置
2.Spring针对bean管理中创建对象提供注解
a)@Componten
b)@Service
c)@Controller
d)@Repository
4中注解的功能都一样,都可以用来创建bean实例
3.基于注解的方式创建对象
1.引入依赖Spring-aop-3.2.6-ReleSae
2.开启组件扫描(只有开启后才知道去哪个包找注解)
a)配置文件中引入命名空间
<?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">
</beans>
b)组件扫描,个包之间中,号分割,也可以是扫描上层目录,加载配置文件时候就扫描
<context:component-scan base-package="Spring04"></context:component-scan>
c)创建类,在类上面添加注解(上面四个注解都可以)
import org.springframework.stereotype.Component;
@Component(value = "userService")
//注解中value值可以省略,默认为类名的首字母大写
public class UserService {
public void add(){
System.out.println("UserService add...");
}
}
d)测试
@Test
public void test1(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
4.开启组件扫描的细节问题
a)不全扫描只扫描包含Controller
1.引入命名空间
2.写Spring配置文件
<!--use-default-filters="false",扫描方式不使用默认都扫描,执行有条件扫描-->
<!--context:include(包含)-filter type="annotation" expression="org.springframework.stereotype.Controller"
,扫描方式按照注解扫描,只扫描包含Controller-->
<context:component-scan base-package="Spring04" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
b)不全扫描只扫描不包含Controller
1.引入命名空间
2.写Spring配置文件
<!--use-default-filters="false",扫描方式不使用默认都扫描,执行有条件扫描-->
<!--context:exclude(不包含)-filter type="annotation" expression="org.springframework.stereotype.Controller"
,扫描方式按照注解扫描,只扫描不包含Controller-->
<context:component-scan base-package="Spring04" use-default-filters="false">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
5.基于注解的方式实现属性注入
a)@Autowired 根据属性类型进行注入
b)@Qualifier 根据属性名称进行注入
c)@Resource 既可以根据属性类型注入也可以根据属性名进行注入
d)@Value 注入普通类的属性
(1)@Autowired:根据属性类型进行自动装配
第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解
第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解
import org.springframework.stereotype.Service;
@Service
public interface UserDao {
public void update();
}
import org.springframework.stereotype.Service;
@Service(value = "UserDaoImpl1")
public class UserDaoImpl implements UserDao{
@Override
public void update() {
System.out.println("UserDao update...");
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServices {
//定义 dao 类型属性
//不需要添加 set 方法
//添加注入属性注解
@Autowired
private UserDao userDao;
public void Update(){
System.out.println("UserService Update ...");
userDao.update();
}
}
<context:component-scan base-package="Spring04"></context:component-scan>
@Test
public void test2(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");
UserServices userServices = context.getBean("userServices", UserServices.class);
userServices.Update();
}
(2)@Qualifier:根据名称进行注入,这个@Qualifier 注解的使用,和上面@Autowired 一起使用
(由于一个接口有多个实现类,为了保证实现类对应引入@Qualifier注解)
@Service
public class UserServices {
@Autowired
@Qualifier(value = "UserDaoImpl1")
private UserDao userDao;
public void Update(){
System.out.println("UserService Update ...");
userDao.update();
}
}
3)@Resource:可以根据类型注入,也可以根据名称注入(它属于javax包下的注解,不推荐使用!)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServices {
//@Resource //根据属性类型进行注入
@Resource(name = "UserDaoImpl1") //根据属性名进行注入
private UserDao userDao;
public void Update(){
System.out.println("UserService Update ...");
userDao.update();
}
}
(4)@Value:注入普通类型属性
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServices {
//@Resource //根据属性类型进行注入
@Resource(name = "UserDaoImpl1") //根据属性名进行注入
private UserDao userDao;
@Value("abc")
private String str;
public void Update(){
System.out.println("UserService Update ...");
userDao.update();
System.out.println(str);
}
}
6.完全注解开发
(1)创建配置类,替代 xml 配置文件,类上面加注解@Configuration,@ComponentScan(basePackages = {"Spring04"})修改需要扫描的类
@Configuration //作为配置类代替xml
@ComponentScan(basePackages = {"Spring04"}) //开启组件扫秒
public class XmlConfiguration {
}
(2)
import org.springframework.stereotype.Service;
@Service
public interface UserDao {
public void update();
}
import org.springframework.stereotype.Service;
@Service(value = "UserDaoImpl1")
public class UserDaoImpl implements UserDao{
@Override
public void update() {
System.out.println("UserDao update...");
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServices {
//@Resource //根据属性类型进行注入
@Resource(name = "UserDaoImpl1") //根据属性名进行注入
private UserDao userDao;
@Value("abc")
private String str;
public void Update(){
System.out.println("UserService Update ...");
userDao.update();
System.out.println(str);
}
}
(3)编写测试类
@Test
public void test3(){
ApplicationContext context=new AnnotationConfigApplicationContext(XmlConfiguration.class);
UserServices userServices = context.getBean("userServices", UserServices.class);
userServices.Update();
}