- 采用注解的方式进行获取
<!--给Dao、Service、Servlet注册,采用注解的方式,Spring遇到这类注解标注的类都会自动加入到容器中
这些注解都是特殊含义的
@Service:建议给sevice类添加
@Controller:建议给servlet类添加
@Respository:Dao类添加
@Component:其他想要加入到容器中的组件
注:Spring地层并不会去区分这些注解的含义,统一认为是加入容器的标志,这只是给程序员自己看的
这些注解默认的组件的id是类名首字母小写
可以修改,注解(value="新id");
同样的,注解修饰的组件也是IOC容器启动时,创建的,默认也是单例的
可以修改作用域
两个注解配合使用,
@特定注解
@scope(value="作用域")
要实现这个功能,需要用到context命名空间,来让Spring知道,这些注解修饰的类要加入到容器中
-->
<!--component-scan来扫描组件
base-package:基础包,Spring会扫描这个包及这个包下的所后代自包
-->
<context:component-scan base-package="com.fgy"></context:component-scan>
2. 使用context:exclude-filter指定扫描包时不包含的类
<!--默认是扫描包下的所类 -->
<context:component-scan base-package="com.fgy">
<!--
type="annotation":排除模式
annotation:排除指定的注解,
expression="":要排除的注解的全类名
"assignable":排除指定的类,及该类下的所子类
expression=""要排除类的全类名
-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:exclude-filter type="assignable" expression="com.fgy.dao.BookDao"/>
</context:component-scan>
3. 使用context:include-filter指定扫描包时要包含的类
<!--默认是扫描包下的所类 -->
<context:component-scan base-package="com.fgy" use-default-filters="false">
<!--
必须的设置 use-default-filters="false"
type="annotation":指定扫描模式
annotation:扫描指定的注解,
expression="":要扫描的注解的全类名
"assignable":扫描指定的类,及该类下的所子类
expression=""要扫描类的全类名
-->
<!-- -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
4. 使用@Autowired注解实现根据类型实现自动装配
<!--@Autowired自动装配属性对象值,get、set方法都不用写
1.属性上标注@Autowired,IOC容器创建对象的时候,会为这个属性自动赋值
2.赋值流程:
1)先照类型赋值
2)如果组件的类型多个,则照其属性名作为组件的id进行赋值
3)如果照变量名都找不到,@Qualifier("id")指定id,来查找装配的组件
4)@Qualifier都找不到,就报错,但是现在不让它报错
默认的情况下,@Autowired标注的属性,一定要装配上,否则就报错
要实现装不上不报错的方法:
在@Autowired(required=false),表示这个属性的装配不是必须的,装不上就算了,不报错
3.给set方法标注的@Autowired和给property标签复赋值一样,自动赋值
4.@Resource和@Autowired那个好:前者是Java定义的规范,后者是自己的东西,我们用哪个呢?我们应该是表规范好一点,别人也能用
这个规范,假设第二个IOC容器,这个容器框架不认识Spring的@Autowired注解,但是认识Java规范,兼容性好。但是,不幸的是IOC容器和AOP
合起来的这个框架,市场上仅一家,所以不用担心兼容性问题
-->
5. 泛型依赖注入
以简单书城项目为类:
在dao包内有三个类,BaseDao,UserDao,BookDao;
public class BaseDao <T>{
public void save() {
System.out.println("BaseDao:将数据保存到数据库中......");
}
}
@Repository
public class BookDao extends BaseDao<Book> {
public void save() {
System.out.println("保存图书到数据库中......");
}
}
@Repository
public class UserDao extends BaseDao<User> {
@Override
public void save() {
System.out.println("保存用户到数据库中......");
}
}
在service包中也有三个类
BaseService,BookService,UserService
public class BaseService<T> {
@Autowired
protected BaseDao<T> baseDao;
}
@Service
public class UserService extends BaseService<User>{
public void save() {
baseDao.save();
}
}
@Service
public class BookService extends BaseService<Book>{
public void save() {
baseDao.save();
}
}
测试类
public class IOCTest {
ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");
@Test
public void test() {
BookService bookService= ioc.getBean(BookService.class);
UserService userService = ioc.getBean(UserService.class);
bookService.save();
userService.save();
}
}