一、(程序耦合)
所谓程序耦合,就是当结对开发的时候,一个人的代码结构,会使其开发进度被其他成员的代码进度所影响,这样会造成很大的危害。
举个例子:
之前我在写普通的Java Web 程序时,我会在Service层直接调用Dao层的方法,那么 如果在开发一个大项目时,我只负责Service层,而别人负责Dao层,我直接调用他的方法,如果他没有写完,我就没有办法继续写代码,程序也无法运行。
二、程序解耦(BeanFactory方法)
可以通过写一个BeanFactory来进行反射调用,这样将需要的参数等直接写到配置文件中,不仅大大降低了代码的耦合度,还简化了代码的结构。
三、BeanFactory 的弊端
经过测试,发现使用BeanFactory时,他是用的多例模式,这样会在调用一个方法内成员时,创建多个实例,是不需要的(因为方法内成员在多线程访问时,不会受到影响,会降低程序的运行效率)
四、线程的安全问题
当定义类成员实例时,多线程访问时,会受影响,例如我在Servlet的类内定义类成员变量 a=1 每次访问时 a++ ,,当我用A浏览器首次访问时,会显示a=1,
但是当我用B浏览器再次访问时,会显示a=2 ,不同的浏览器可以代表不同 的用户的访问,所以显然在多线程访问时,定义类成员实例会严重影响线程安全。
五、以上全是个人理解,如果有理解错误,希望收到指正,谢谢。下面附上一个BeanFactory进行解耦的例子
1 public interface StudentDao {
2
3 public void studentDao();
4
5 }
知识兔1 public class StudentDaoImp implements StudentDao {
2 @Override
3 public void studentDao() {
4 System.out.println("我是StudentDao!!");
5 }
6 }
知识兔1 public interface StudentService {
2
3 public void studentService();
4
5 }
知识兔 1 import BeanFactory_Thread.BeanFactory.Factory;
2 import BeanFactory_Thread.dao.StudentDao;
3
4
5 public class StudentServiceImp implements StudentService {
6 @Override
7 public void studentService() {
8 System.out.println("我是StudentService!!!");
9 // StudentDao studentDao=new StudentDaoImp();
10 Factory factory = new Factory();
11 StudentDao studentDao = (StudentDao) factory.getBean("StudentDao");
12 studentDao.studentDao();
13 }
14 }
知识兔 1 import java.util.ResourceBundle;
2
3 public class Factory {
4 //通过resourceBundle读取配置文件
5 private static ResourceBundle resourceBundle = ResourceBundle.getBundle("beanFactory_Thread");
6
7 //定义getBean()函数用来获取需要的类
8 public static Object getBean(String beanName) {
9 //通过传递参数来获取类的路径
10 String beanPath = resourceBundle.getString(beanName);
11 Object className = null;
12 try {
13 //读取类路径,
14 // 获取类的实例 forName()是加载某个类并不能生成某各类的实例,
15 // newInstance()则是在加载了类的基础上生成某个类的实例
16 className = Class.forName(beanPath).newInstance();
17 } catch (Exception e) {
18 e.printStackTrace();
19 } finally {
20 //返回类的实例
21 return className;
22 }
23 }
24
25 }
知识兔 1 import BeanFactory_Thread.BeanFactory.Factory;
2 import BeanFactory_Thread.service.StudentServiceImp;
3
4 public class Main {
5 public static void main(String[] args) {
6 Factory factory= new Factory();
7 //避免了直接使用NEW StudentDaoImp()这种方式的的调用,没有产生依赖
8 StudentServiceImp studentServiceImp= (StudentServiceImp) factory.getBean("StudentService");
9 studentServiceImp.studentService();
10 }
11 }
知识兔