1.什么是注解
(1)注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的,简化xml配置
2.Spring针对bean管理中创建对象提供的四种注解:
(1)@Conponent
(2)@Service
(3)@Contorller
(4)@Respository
*上面四个注解功能是一样的,都可以用来创建bean实例
3.基于注解方式实现对象创建
第一步引入依赖
第二步开启组件扫描,需要引入命名空间context
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.扫描包上层目录 --> <context:component-scan base-package="com.company"></context:component-scan> </beans>
第三步 创建类,在类上配置注解
//注解里面Value属性值可以省略不写 //默认值是类名称,首字母小写 //UserService = userService //@Component(value = "userService") //<bean id="userService" class=""> @Controller public class UserService { public void add(){ System.out.println("service add....."); } }
运行效果
4.开启组件扫描细节配置
<!--示例1 use-default-filters="false"表示现在不适用默认filter,自己配置fileter context:include-filter,设置扫描哪些内容 expression="org.springframework.stereotype.Controller"只扫描Controller注解 --> <context:component-scan base-package="com.company" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:include-filter> </context:component-scan> <!--示例2 下面配置扫描包所有内容 context:exclude-filter,设置哪些内容不扫描 --> <context:component-scan base-package="com.company"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter> </context:component-scan>
5.基于注解方式属性的注入
(1)@AutoWired:根据属性类型进行自动装配
第一步在service和dao对象创建,在service和dao类添加创建对象注释
第二步在service注入dao对象,在service类添加dao属性类型,在属性上面使用注释、
@Repository public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("add dao"); } }
@Controller public class UserService { //定义dao类型属性 //不需要添加set方法 //添加注入属性注解,有多个实现类需要指定名称 @Autowired private UserDao userDao; public void add(){ System.out.println("service add....."); userDao.add(); } }
@Controller(value = "userdao2") public class UserDaoImpl2 implements UserDao { @Override public void add() { System.out.println("userdao2"); } }
(2)@Qualifier: 根据属性名称进行注入
这个注解的使用,需要配合@Autowired一起使用
@Controller public class UserService { //定义dao类型属性 //不需要添加set方法 //添加注入属性注解,有多个实现类需要指定名称 @Autowired @Qualifier(value = "userdao2") //根据注释名称指定注入,上面创建类中,如果不指定名称,则默认名称为类的首字母小写 private UserDao userDao; public void add(){ System.out.println("service add....."); userDao.add(); } }
(3)@Resource: 可以根据类型注入,也可以根据名称注入
@Resource(name = "userDaoImpl2") //默认根据名称注入,但是如果同时存在两个实现类,会报错注入不了,只有存在一个类的时候会注入成功,我感觉默认是根据类型注入
private UserDao userDao;
public void add(){
System.out.println("service add.....");
userDao.add();
}
(4)@Value:注入普通属性
@Value(value = "zk") private String name;
6.完全注解开发
(1)创建配置类,替代xml配置文件
@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.company"})
public class SpringConfig {
}
(2)编写测试类
public void testService(){ // ApplicationContext context = // new ClassPathXmlApplicationContext("bean1.xml"); // UserService userService = context.getBean("userService",UserService.class); // System.out.println(userService); // userService.add(); //完全注解开发,配置类实现 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService",UserService.class); System.out.println(userService); userService.add(); }