导入jar包,引入约束
<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:component-scan base-package="annotation"></context:component-scan>
如果有多个包,可以导入多个
<!--开启注解扫描-->
<context:component-scan base-package="annotation,XmlTest"></context:component-scan>
或者直接写包前缀
<!--开启注解扫描-->
<context:component-scan base-package="com.alibaba"></context:component-scan>
注解方式创建对象
在类的上面添加注解:
@Component(value = "user") //等价于<bean id="user" class="User"></bean>
public class User {
public void add() {
System.out.println("add........");
}
}
注解方式测试:
@Test
public void testUser() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
User user = (User) context.getBean("user");
System.out.println(user);
user.add();
}
创建对象有四个注解:
这四个注解的功能是一样的,都用来创建对象
在配置文件中仍然只有一行
默认为单例模式:
如果想要创建多实例:
@Component(value = "user") //等价于<bean id="user" class="User"></bean>
@Scope(value = "prototype") //默认单实例,创建多实例
public class User {
public void add() {
System.out.println("add........");
}
}
注解方式注入属性
- 创建Service类和dao类
- 在Service里面注入dao类对象
配置文件的写法:
<bean id="dao" class="ioc.UserDao"></bean>
<bean id="service" class="ioc.UserService">
<!--不要写value,因为不是字符串,写bean标签中id的值-->
<property name="userDao" ref="dao"></property>
</bean>
现在不需要这么麻烦了。
仍然是首先创建Bean对象。value属性值可以省略
import org.springframework.stereotype.Component;
@Component("service")
public class UserService {
public void add() {
System.out.println("UserService......");
}
}
@Component(value = "dao")
public class UserDao {
public void add() {
System.out.println("UserDao.....");
}
}
第一个注解:Autowired
在Service里面定义Dao属性,使用注解方式不需要set方法,在dao属性上面使用注解,完成对象注入
@Component("service")
public class UserService {
//@Autowired自动注入
@Autowired
UserDao userDao;
public void add() {
userDao.add();
System.out.println("UserService......");
}
}
跟bean的id无关,自动装备是根据UserDao这个类型类进行寻找的
第二个注解(用的最多)
@Component("service")
public class UserService {
//@Autowired自动注入
// @Autowired
// UserDao userDao;
@Resource(name="dao")
UserDao userDao;
public void add() {
userDao.add();
System.out.println("UserService......");
}
}
配置文件和注解方式的混合使用
- 创建对象的方式使用配置文件的方式
- 注入属性的操作使用注解的方式实现
package xmlanno;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
public class BookService {
//得到bookDao和OrdersDao对象
@Resource("bookDao")
private BookDao bookDao;
@Resource("ordersDao")
private OrdersDao ordersDao;
@Test
public void add() {
System.out.println("service...");
}
}
<?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:component-scan base-package="xmlanno"></context:component-scan>
<!--配置对象-->
<bean id="bookService" class="xmlanno.BookService"></bean>
<bean id="bookDao" class="xmlanno.BookDao"></bean>
<bean id="ordersDao" class="xmlanno.OrdersDao"></bean>
</beans>